ZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMzc5ZGI1MC4uZGE3YTgxMSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTU2NDAsNiArNTY0MCwxMiBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9zY3NpL3dkNzAwMC5jCiAKK1dJTkJPTkQgQ0lSIERSSVZFUgorUDoJRGF2aWQgSORyZGVtYW4KK006CWRhdmlkQGhhcmRlbWFuLm51CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2lucHV0L21pc2Mvd2luYm9uZC1jaXIuYworCiBXSU1BWCBTVEFDSwogTToJSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KIE06CWxpbnV4LXdpbWF4QGludGVsLmNvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwppbmRleCAxYTUwYmUzLi43NmQ2NzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwpAQCAtMjIyLDYgKzIyMiwyMiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2dpX2J0bnMuCiAKK2NvbmZpZyBJTlBVVF9XSU5CT05EX0NJUgorCXRyaXN0YXRlICJXaW5ib25kIElSIHJlbW90ZSBjb250cm9sIgorCWRlcGVuZHMgb24gWDg2ICYmIFBOUAorCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IEJJVFJFVkVSU0UKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgSVIgcmVtb3RlIGZ1bmN0aW9uYWxpdHkgZm91bmQKKwkgIGluIHNvbWUgV2luYm9uZCBTdXBlckkvTyBjaGlwcy4gQ3VycmVudGx5IG9ubHkgdGhlIFdQQ0QzNzZJCisJICBjaGlwIGlzIHN1cHBvcnRlZCAoaW5jbHVkZWQgaW4gc29tZSBJbnRlbCBNZWRpYSBzZXJpZXMgbW90aGVyYm9hcmRzKS4KKworCSAgSVIgUmVjZWl2ZSBhbmQgd2FrZS1vbi1JUiBmcm9tIHN1c3BlbmQgYW5kIHBvd2VyLW9mZiBpcyBjdXJyZW50bHkKKwkgIHN1cHBvcnRlZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgd2luYm9uZF9jaXIuCisKIGNvbmZpZyBIUF9TRENfUlRDCiAJdHJpc3RhdGUgIkhQIFNEQyBSZWFsIFRpbWUgQ2xvY2siCiAJZGVwZW5kcyBvbiAoR1NDIHx8IEhQMzAwKSAmJiBTRVJJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCmluZGV4IGJmNGRiNjIuLmE4Yjg0ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19JTlBVVF9TUEFSQ1NQS1IpCQkrPSBzcGFyY3Nwa3Iubwogb2JqLSQoQ09ORklHX0lOUFVUX1RXTDQwMzBfUFdSQlVUVE9OKQkrPSB0d2w0MDMwLXB3cmJ1dHRvbi5vCiBvYmotJChDT05GSUdfSU5QVVRfVUlOUFVUKQkJKz0gdWlucHV0Lm8KK29iai0kKENPTkZJR19JTlBVVF9XSU5CT05EX0NJUikJCSs9IHdpbmJvbmQtY2lyLm8KIG9iai0kKENPTkZJR19JTlBVVF9XSVNUUk9OX0JUTlMpCSs9IHdpc3Ryb25fYnRucy5vCiBvYmotJChDT05GSUdfSU5QVVRfV004MzFYX09OKQkJKz0gd204MzF4LW9uLm8KIG9iai0kKENPTkZJR19JTlBVVF9ZRUFMSU5LKQkJKz0geWVhbGluay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2Mvd2luYm9uZC1jaXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aW5ib25kLWNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2Mvd2luYm9uZC1jaXIuYwpAQCAtMCwwICsxLDE2MTQgQEAKKy8qCisgKiAgd2luYm9uZC1jaXIuYyAtIERyaXZlciBmb3IgdGhlIENvbnN1bWVyIElSIGZ1bmN0aW9uYWxpdHkgb2YgV2luYm9uZAorICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KKyAqCisgKiAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBXaW5ib25kIFdQQ0QzNzZpIGNoaXAgKFBOUCBpZCBXRUMxMDIyKSwgYnV0CisgKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQorICogIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucy4KKyAqCisgKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KKyAqCisgKiAgRGVkaWNhdGVkIHRvIE1hdGlsZGEsIG15IG5ld2Jvcm4gZGF1Z2h0ZXIsIHdpdGhvdXQgd2hvc2UgbG92aW5nIGF0dGVudGlvbgorICogIHRoaXMgZHJpdmVyIHdvdWxkIGhhdmUgYmVlbiBmaW5pc2hlZCBpbiBoYWxmIHRoZSB0aW1lIGFuZCB3aXRoIGEgZnJhY3Rpb24KKyAqICBvZiB0aGUgYnVncy4KKyAqCisgKiAgV3JpdHRlbiB1c2luZzoKKyAqICAgIG8gV2luYm9uZCBXUENEMzc2SSBkYXRhc2hlZXQgaGVscGZ1bGx5IHByb3ZpZGVkIGJ5IEplc3NlIEJhcm5lcyBhdCBJbnRlbAorICogICAgbyBOYXRTZW1pIFBDODczMzgvUEM5NzMzOCBkYXRhc2hlZXQgKGZvciB0aGUgc2VyaWFsIHBvcnQgc3R1ZmYpCisgKiAgICBvIERTRFQgZHVtcHMKKyAqCisgKiAgU3VwcG9ydGVkIGZlYXR1cmVzOgorICogICAgbyBSQzYKKyAqICAgIG8gV2FrZS1Pbi1DSVIgZnVuY3Rpb25hbGl0eQorICoKKyAqICBUbyBkbzoKKyAqICAgIG8gVGVzdCBORUMgYW5kIFJDNQorICoKKyAqICBMZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyOgorICogICAgbyBMZWFybmluZyAoSSBoYXZlIG5laXRoZXIgdGhlIGhhcmR3YXJlLCBub3IgdGhlIG5lZWQpCisgKiAgICBvIElSIFRyYW5zbWl0IChpYmlkKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNkZWZpbmUgRFJWTkFNRSAid2luYm9uZC1jaXIiCisKKy8qIENFSVIgV2FrZS1VcCBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPndiYXNlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DVEwJMHgwMyAvKiBDRUlSIFJlY2VpdmVyIENvbnRyb2wJCSovCisjZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9TVFMJMHgwNCAvKiBDRUlSIFJlY2VpdmVyIFN0YXR1cwkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0VWX0VOCTB4MDUgLyogQ0VJUiBSZWNlaXZlciBFdmVudCBFbmFibGUJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEwJMHgwNiAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgTG93CSovCisjZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DTlRICTB4MDcgLyogQ0VJUiBSZWNlaXZlciBDb3VudGVyIEhpZ2gJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0lOREVYCTB4MDggLyogQ0VJUiBSZWNlaXZlciBJbmRleAkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0RBVEEJMHgwOSAvKiBDRUlSIFJlY2VpdmVyIERhdGEJCSovCisjZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DU0wJMHgwQSAvKiBDRUlSIFJlLiBDb21wYXJlIFN0cmxlbgkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzEJMHgwQiAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDEJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzIJMHgwQyAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDIJKi8KKworLyogQ0VJUiBFbmhhbmNlZCBGdW5jdGlvbmFsaXR5IFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+ZWJhc2UgICAgICAgKi8KKyNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NUUwkweDAwIC8qIEVuaGFuY2VkIElSIENvbnRyb2wgU3RhdHVzCSovCisjZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMCTB4MDEgLyogSW5mcmFyZWQgQ291bnRlciBDb250cm9sCSovCisjZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DTlRfTE8JMHgwMiAvKiBJbmZyYXJlZCBDb3VudGVyIExTQgkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NOVF9ISQkweDAzIC8qIEluZnJhcmVkIENvdW50ZXIgTVNCCQkqLworI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfSVJFTQkweDA0IC8qIEluZnJhcmVkIEVtaXR0ZXIgU3RhdHVzCQkqLworCisvKiBTUDMgQmFua2VkIFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+c2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JTUgkweDAzIC8qIEJhbmsgU2VsZWN0LCBhbGwgYmFua3MJCSovCisJCQkJICAgICAgLyogQmFuayAwCQkJCSovCisjZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhEQVRBCTB4MDAgLyogRklGTyBSWCBkYXRhIChyKQkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1NQM19UWERBVEEJMHgwMCAvKiBGSUZPIFRYIGRhdGEgKHcpCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lFUgkweDAxIC8qIEludGVycnVwdCBFbmFibGUJCSovCisjZGVmaW5lIFdCQ0lSX1JFR19TUDNfRUlSCTB4MDIgLyogRXZlbnQgSWRlbnRpZmljYXRpb24gKHIpCSovCisjZGVmaW5lIFdCQ0lSX1JFR19TUDNfRkNSCTB4MDIgLyogRklGTyBDb250cm9sICh3KQkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1NQM19NQ1IJMHgwNCAvKiBNb2RlIENvbnRyb2wJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0xTUgkweDA1IC8qIExpbmsgU3RhdHVzCQkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1NQM19NU1IJMHgwNiAvKiBNb2RlbSBTdGF0dXMJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0FTQ1IJMHgwNyAvKiBBdXggU3RhdHVzIGFuZCBDb250cm9sCQkqLworCQkJCSAgICAgIC8qIEJhbmsgMgkJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JHREwJMHgwMCAvKiBCYXVkIERpdmlzb3IgTFNCCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JHREgJMHgwMSAvKiBCYXVkIERpdmlzb3IgTVNCCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IxCTB4MDIgLyogRXh0ZW5kZWQgQ29udHJvbCAxCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IyCTB4MDQgLyogRXh0ZW5kZWQgQ29udHJvbCAyCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYRkxWCTB4MDYgLyogVFggRklGTyBMZXZlbAkJCSovCisjZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhGTFYJMHgwNyAvKiBSWCBGSUZPIExldmVsCQkJKi8KKwkJCQkgICAgICAvKiBCYW5rIDMJCQkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1NQM19NUklECTB4MDAgLyogTW9kdWxlIElkZW50aWZpY2F0aW9uCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0xDUgkweDAxIC8qIExDUiBTaGFkb3cJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0ZDUgkweDAyIC8qIEZDUiBTaGFkb3cJCQkqLworCQkJCSAgICAgIC8qIEJhbmsgNAkJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IxCTB4MDIgLyogSW5mcmFyZWQgQ29udHJvbCAxCQkqLworCQkJCSAgICAgIC8qIEJhbmsgNQkJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IyCTB4MDQgLyogSW5mcmFyZWQgQ29udHJvbCAyCQkqLworCQkJCSAgICAgIC8qIEJhbmsgNgkJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IzCTB4MDAgLyogSW5mcmFyZWQgQ29udHJvbCAzCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NJUl9QVwkweDAyIC8qIFNJUiBQdWxzZSBXaWR0aAkJKi8KKwkJCQkgICAgICAvKiBCYW5rIDcJCQkJKi8KKyNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlJYREMJMHgwMCAvKiBJUiBSWCBEZW1vZCBDb250cm9sCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSVFhNQwkweDAxIC8qIElSIFRYIE1vZCBDb250cm9sCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JDQ0ZHCTB4MDIgLyogQ0VJUiBDb25maWcJCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ0ZHMQkweDA0IC8qIEluZnJhcmVkIENvbmZpZyAxCQkqLworI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ0ZHNAkweDA3IC8qIEluZnJhcmVkIENvbmZpZyA0CQkqLworCisvKgorICogTWFnaWMgdmFsdWVzIGZvbGxvdworICovCisKKy8qIE5vIGludGVycnVwdHMgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLworI2RlZmluZSBXQkNJUl9JUlFfTk9ORQkJMHgwMAorLyogUlggZGF0YSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLworI2RlZmluZSBXQkNJUl9JUlFfUlgJCTB4MDEKKy8qIE92ZXIvVW5kZXItZmxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLworI2RlZmluZSBXQkNJUl9JUlFfRVJSCQkweDA0CisvKiBMZWQgZW5hYmxlL2Rpc2FibGUgYml0IGZvciBXQkNJUl9SRUdfRUNFSVJfQ1RTICovCisjZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAorLyogUlggZGF0YSBhdmFpbGFibGUgYml0IGZvciBXQkNJUl9SRUdfU1AzX0xTUiAqLworI2RlZmluZSBXQkNJUl9SWF9BVkFJTAkJMHgwMQorLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLworI2RlZmluZSBXQkNJUl9SWF9ESVNBQkxFCTB4MjAKKy8qIEV4dGVuZGVkIG1vZGUgZW5hYmxlIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19FWENSMSAqLworI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKKy8qIFNlbGVjdCBjb21wYXJlIHJlZ2lzdGVyIGluIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCAoYml0cyA1ICYgNikgKi8KKyNkZWZpbmUgV0JDSVJfUkVHU0VMX0NPTVBBUkUJMHgxMAorLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLworI2RlZmluZSBXQkNJUl9SRUdTRUxfTUFTSwkweDIwCisvKiBTdGFydGluZyBhZGRyZXNzIG9mIHNlbGVjdGVkIHJlZ2lzdGVyIGluIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCAqLworI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKKworLyogVmFsaWQgYmFua3MgZm9yIHRoZSBTUDMgVUFSVCAqLworZW51bSB3YmNpcl9iYW5rIHsKKwlXQkNJUl9CQU5LXzAgICAgICAgICAgPSAweDAwLAorCVdCQ0lSX0JBTktfMSAgICAgICAgICA9IDB4ODAsCisJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKKwlXQkNJUl9CQU5LXzMgICAgICAgICAgPSAweEU0LAorCVdCQ0lSX0JBTktfNCAgICAgICAgICA9IDB4RTgsCisJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKKwlXQkNJUl9CQU5LXzYgICAgICAgICAgPSAweEYwLAorCVdCQ0lSX0JBTktfNyAgICAgICAgICA9IDB4RjQsCit9OworCisvKiBTdXBwb3J0ZWQgSVIgUHJvdG9jb2xzICovCitlbnVtIHdiY2lyX3Byb3RvY29sIHsKKwlJUl9QUk9UT0NPTF9SQzUgICAgICAgICAgPSAweDAsCisJSVJfUFJPVE9DT0xfTkVDICAgICAgICAgID0gMHgxLAorCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKK307CisKKy8qIE1pc2MgKi8KKyNkZWZpbmUgV0JDSVJfTkFNRQkiV2luYm9uZCBDSVIiCisjZGVmaW5lIFdCQ0lSX0lEX0ZBTUlMWSAgICAgICAgICAweEYxIC8qIEZhbWlseSBJRCBmb3IgdGhlIFdQQ0QzNzZJCSovCisjZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLworI2RlZmluZSBJUl9LRVlQUkVTU19USU1FT1VUICAgICAgIDI1MCAvKiBGSVhNRTogc2hvdWxkIGJlIHBlci1wcm90b2NvbD8gKi8KKyNkZWZpbmUgSU5WQUxJRF9TQ0FOQ09ERSAgIDB4N0ZGRkZGRkYgLyogSW52YWxpZCB3aXRoIGFsbCBwcm90b3MJKi8KKyNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KKyNkZWZpbmUgRUhGVU5DX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogRW5oYW5jZWQgRnVuYyBJL08gUmVnIExlbgkqLworI2RlZmluZSBTUF9JT01FTV9MRU4gICAgICAgICAgICAgMHgwOCAvKiBTZXJpYWwgUG9ydCAzIChJUikgUmVnIExlbgkqLworI2RlZmluZSBXQkNJUl9NQVhfSURMRV9CWVRFUyAgICAgICAxMAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdiY2lyX2xvY2spOworc3RhdGljIERFRklORV9SV0xPQ0soa2V5dGFibGVfbG9jayk7CisKK3N0cnVjdCB3YmNpcl9rZXkgeworCXUzMiBzY2FuY29kZTsKKwl1bnNpZ25lZCBpbnQga2V5Y29kZTsKK307CisKK3N0cnVjdCB3YmNpcl9rZXllbnRyeSB7CisJc3RydWN0IHdiY2lyX2tleSBrZXk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RhdGljIHN0cnVjdCB3YmNpcl9rZXkgcmM2X2RlZl9rZXltYXBbXSA9IHsKKwl7IDB4ODAwRjA0MDAsIEtFWV9OVU1FUklDXzAJCX0sCisJeyAweDgwMEYwNDAxLCBLRVlfTlVNRVJJQ18xCQl9LAorCXsgMHg4MDBGMDQwMiwgS0VZX05VTUVSSUNfMgkJfSwKKwl7IDB4ODAwRjA0MDMsIEtFWV9OVU1FUklDXzMJCX0sCisJeyAweDgwMEYwNDA0LCBLRVlfTlVNRVJJQ180CQl9LAorCXsgMHg4MDBGMDQwNSwgS0VZX05VTUVSSUNfNQkJfSwKKwl7IDB4ODAwRjA0MDYsIEtFWV9OVU1FUklDXzYJCX0sCisJeyAweDgwMEYwNDA3LCBLRVlfTlVNRVJJQ183CQl9LAorCXsgMHg4MDBGMDQwOCwgS0VZX05VTUVSSUNfOAkJfSwKKwl7IDB4ODAwRjA0MDksIEtFWV9OVU1FUklDXzkJCX0sCisJeyAweDgwMEYwNDFELCBLRVlfTlVNRVJJQ19TVEFSCQl9LAorCXsgMHg4MDBGMDQxQywgS0VZX05VTUVSSUNfUE9VTkQJCX0sCisJeyAweDgwMEYwNDEwLCBLRVlfVk9MVU1FVVAJCX0sCisJeyAweDgwMEYwNDExLCBLRVlfVk9MVU1FRE9XTgkJfSwKKwl7IDB4ODAwRjA0MTIsIEtFWV9DSEFOTkVMVVAJCX0sCisJeyAweDgwMEYwNDEzLCBLRVlfQ0hBTk5FTERPV04JCX0sCisJeyAweDgwMEYwNDBFLCBLRVlfTVVURQkJCX0sCisJeyAweDgwMEYwNDBELCBLRVlfVkVORE9SCQl9LCAvKiBWaXN0YSBMb2dvIEtleSAqLworCXsgMHg4MDBGMDQxRSwgS0VZX1VQCQkJfSwKKwl7IDB4ODAwRjA0MUYsIEtFWV9ET1dOCQkJfSwKKwl7IDB4ODAwRjA0MjAsIEtFWV9MRUZUCQkJfSwKKwl7IDB4ODAwRjA0MjEsIEtFWV9SSUdIVAkJCX0sCisJeyAweDgwMEYwNDIyLCBLRVlfT0sJCQl9LAorCXsgMHg4MDBGMDQyMywgS0VZX0VTQwkJCX0sCisJeyAweDgwMEYwNDBGLCBLRVlfSU5GTwkJCX0sCisJeyAweDgwMEYwNDBBLCBLRVlfQ0xFQVIJCQl9LAorCXsgMHg4MDBGMDQwQiwgS0VZX0VOVEVSCQkJfSwKKwl7IDB4ODAwRjA0NUIsIEtFWV9SRUQJCQl9LAorCXsgMHg4MDBGMDQ1QywgS0VZX0dSRUVOCQkJfSwKKwl7IDB4ODAwRjA0NUQsIEtFWV9ZRUxMT1cJCX0sCisJeyAweDgwMEYwNDVFLCBLRVlfQkxVRQkJCX0sCisJeyAweDgwMEYwNDVBLCBLRVlfVEVYVAkJCX0sCisJeyAweDgwMEYwNDI3LCBLRVlfU1dJVENIVklERU9NT0RFCX0sCisJeyAweDgwMEYwNDBDLCBLRVlfUE9XRVIJCQl9LAorCXsgMHg4MDBGMDQ1MCwgS0VZX1JBRElPCQkJfSwKKwl7IDB4ODAwRjA0NDgsIEtFWV9QVlIJCQl9LAorCXsgMHg4MDBGMDQ0NywgS0VZX0FVRElPCQkJfSwKKwl7IDB4ODAwRjA0MjYsIEtFWV9FUEcJCQl9LAorCXsgMHg4MDBGMDQ0OSwgS0VZX0NBTUVSQQkJfSwKKwl7IDB4ODAwRjA0MjUsIEtFWV9UVgkJCX0sCisJeyAweDgwMEYwNDRBLCBLRVlfVklERU8JCQl9LAorCXsgMHg4MDBGMDQyNCwgS0VZX0RWRAkJCX0sCisJeyAweDgwMEYwNDE2LCBLRVlfUExBWQkJCX0sCisJeyAweDgwMEYwNDE4LCBLRVlfUEFVU0UJCQl9LAorCXsgMHg4MDBGMDQxOSwgS0VZX1NUT1AJCQl9LAorCXsgMHg4MDBGMDQxNCwgS0VZX0ZBU1RGT1JXQVJECQl9LAorCXsgMHg4MDBGMDQxQSwgS0VZX05FWFQJCQl9LAorCXsgMHg4MDBGMDQxQiwgS0VZX1BSRVZJT1VTCQl9LAorCXsgMHg4MDBGMDQxNSwgS0VZX1JFV0lORAkJfSwKKwl7IDB4ODAwRjA0MTcsIEtFWV9SRUNPUkQJCX0sCit9OworCisvKiBSZWdpc3RlcnMgYW5kIG90aGVyIHN0YXRlIGlzIHByb3RlY3RlZCBieSB3YmNpcl9sb2NrICovCitzdHJ1Y3Qgd2JjaXJfZGF0YSB7CisJdW5zaWduZWQgbG9uZyB3YmFzZTsgICAgICAgIC8qIFdha2UtVXAgQmFzZWFkZHIJCSovCisJdW5zaWduZWQgbG9uZyBlYmFzZTsgICAgICAgIC8qIEVuaGFuY2VkIEZ1bmMuIEJhc2VhZGRyCSovCisJdW5zaWduZWQgbG9uZyBzYmFzZTsgICAgICAgIC8qIFNlcmlhbCBQb3J0IEJhc2VhZGRyCSovCisJdW5zaWduZWQgaW50ICBpcnE7ICAgICAgICAgIC8qIFNlcmlhbCBQb3J0IElSUQkJKi8KKworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9rZXl1cDsKKwlzdHJ1Y3QgbGVkX3RyaWdnZXIgKnJ4dHJpZ2dlcjsKKwlzdHJ1Y3QgbGVkX3RyaWdnZXIgKnR4dHJpZ2dlcjsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsKKworCXUzMiBsYXN0X3NjYW5jb2RlOworCXVuc2lnbmVkIGludCBsYXN0X2tleWNvZGU7CisJdTggbGFzdF90b2dnbGU7CisJdTgga2V5cHJlc3NlZDsKKwl1bnNpZ25lZCBsb25nIGtleXVwX2ppZmZpZXM7CisJdW5zaWduZWQgaW50IGlkbGVfY291bnQ7CisKKwkvKiBSWCBpcmRhdGEgYW5kIHBhcnNpbmcgc3RhdGUgKi8KKwl1bnNpZ25lZCBsb25nIGlyZGF0YVszMF07CisJdW5zaWduZWQgaW50IGlyZGF0YV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgaXJkYXRhX2lkbGU7CisJdW5zaWduZWQgaW50IGlyZGF0YV9vZmY7CisJdW5zaWduZWQgaW50IGlyZGF0YV9lcnJvcjsKKworCS8qIFByb3RlY3RlZCBieSBrZXl0YWJsZV9sb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBrZXl0YWJsZTsKK307CisKK3N0YXRpYyBlbnVtIHdiY2lyX3Byb3RvY29sIHByb3RvY29sID0gSVJfUFJPVE9DT0xfUkM2OworbW9kdWxlX3BhcmFtKHByb3RvY29sLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJvdG9jb2wsICJJUiBwcm90b2NvbCB0byB1c2UgIgorCQkgIigwID0gUkM1LCAxID0gTkVDLCAyID0gUkM2QSwgZGVmYXVsdCkiKTsKKworc3RhdGljIGludCBpbnZlcnQ7IC8qIGRlZmF1bHQgPSAwICovCittb2R1bGVfcGFyYW0oaW52ZXJ0LCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW52ZXJ0LCAiSW52ZXJ0IHRoZSBzaWduYWwgZnJvbSB0aGUgSVIgcmVjZWl2ZXIiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3NjID0gMHg4MDBGMDQwQzsKK21vZHVsZV9wYXJhbSh3YWtlX3NjLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2FrZV9zYywgIlNjYW5jb2RlIG9mIHRoZSBwb3dlci1vbiBJUiBjb21tYW5kIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9yYzZtb2RlID0gNjsKK21vZHVsZV9wYXJhbSh3YWtlX3JjNm1vZGUsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3YWtlX3JjNm1vZGUsICJSQzYgbW9kZSBmb3IgdGhlIHBvd2VyLW9uIGNvbW1hbmQgIgorCQkgIigwID0gMCwgNiA9IDZBLCBkZWZhdWx0KSIpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVVRJTElUWSBGVU5DVElPTlMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENhbGxlciBuZWVkcyB0byBob2xkIHdiY2lyX2xvY2sgKi8KK3N0YXRpYyB2b2lkCit3YmNpcl9zZXRfYml0cyh1bnNpZ25lZCBsb25nIGFkZHIsIHU4IGJpdHMsIHU4IG1hc2spCit7CisJdTggdmFsOworCisJdmFsID0gaW5iKGFkZHIpOworCXZhbCA9ICgodmFsICYgfm1hc2spIHwgKGJpdHMgJiBtYXNrKSk7CisJb3V0Yih2YWwsIGFkZHIpOworfQorCisvKiBTZWxlY3RzIHRoZSByZWdpc3RlciBiYW5rIGZvciB0aGUgc2VyaWFsIHBvcnQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord2JjaXJfc2VsZWN0X2Jhbmsoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGVudW0gd2JjaXJfYmFuayBiYW5rKQoreworCW91dGIoYmFuaywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JTUik7Cit9CisKK3N0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzCit3YmNpcl9sZWRfYnJpZ2h0bmVzc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3Qgd2JjaXJfZGF0YSwKKwkJCQkJICAgICAgIGxlZCk7CisKKwlpZiAoaW5iKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUykgJiBXQkNJUl9MRURfRU5BQkxFKQorCQlyZXR1cm4gTEVEX0ZVTEw7CisJZWxzZQorCQlyZXR1cm4gTEVEX09GRjsKK30KKworc3RhdGljIHZvaWQKK3diY2lyX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCSAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3Qgd2JjaXJfZGF0YSwKKwkJCQkJICAgICAgIGxlZCk7CisKKwl3YmNpcl9zZXRfYml0cyhkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMsCisJCSAgICAgICBicmlnaHRuZXNzID09IExFRF9PRkYgPyAweDAwIDogV0JDSVJfTEVEX0VOQUJMRSwKKwkJICAgICAgIFdCQ0lSX0xFRF9FTkFCTEUpOworfQorCisvKiBNYW5jaGVzdGVyIGVuY29kZXMgYml0cyB0byBSQzYgbWVzc2FnZSBjZWxscyAoc2VlIHdiY2lyX3BhcnNlX3JjNikgKi8KK3N0YXRpYyB1OAord2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQoreworCXU4IGNvZGVkID0gMHgwMDsKKwlpbnQgaTsKKworCXZhbCAmPSAweDBGOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHZhbCAmIDB4MDEpCisJCQljb2RlZCB8PSAweDAyIDw8IChpICogMik7CisJCWVsc2UKKwkJCWNvZGVkIHw9IDB4MDEgPDwgKGkgKiAyKTsKKwkJdmFsID4+PSAxOworCX0KKworCXJldHVybiBjb2RlZDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIElOUFVUIEZVTkNUSU9OUworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludAord2JjaXJfZG9fZ2V0a2V5Y29kZShzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgdTMyIHNjYW5jb2RlKQoreworCXN0cnVjdCB3YmNpcl9rZXllbnRyeSAqa2V5ZW50cnk7CisJdW5zaWduZWQgaW50IGtleWNvZGUgPSBLRVlfUkVTRVJWRUQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleWVudHJ5LCAmZGF0YS0+a2V5dGFibGUsIGxpc3QpIHsKKwkJaWYgKGtleWVudHJ5LT5rZXkuc2NhbmNvZGUgPT0gc2NhbmNvZGUpIHsKKwkJCWtleWNvZGUgPSBrZXllbnRyeS0+a2V5LmtleWNvZGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmtleXRhYmxlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4ga2V5Y29kZTsKK30KKworc3RhdGljIGludAord2JjaXJfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50ICprZXljb2RlKQoreworCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCSprZXljb2RlID0gKGludCl3YmNpcl9kb19nZXRrZXljb2RlKGRhdGEsICh1MzIpc2NhbmNvZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YmNpcl9zZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNzY2FuY29kZSwgaW50IGtleWNvZGUpCit7CisJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3YmNpcl9rZXllbnRyeSAqa2V5ZW50cnk7CisJc3RydWN0IHdiY2lyX2tleWVudHJ5ICpuZXdfa2V5ZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgb2xkX2tleWNvZGUgPSBLRVlfUkVTRVJWRUQ7CisJdTMyIHNjYW5jb2RlID0gKHUzMilzc2NhbmNvZGU7CisKKwlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3X2tleWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKm5ld19rZXllbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghbmV3X2tleWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgma2V5dGFibGVfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXllbnRyeSwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CisJCWlmIChrZXllbnRyeS0+a2V5LnNjYW5jb2RlICE9IHNjYW5jb2RlKQorCQkJY29udGludWU7CisKKwkJb2xkX2tleWNvZGUgPSBrZXllbnRyeS0+a2V5LmtleWNvZGU7CisJCWtleWVudHJ5LT5rZXkua2V5Y29kZSA9IGtleWNvZGU7CisKKwkJaWYgKGtleWVudHJ5LT5rZXkua2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpIHsKKwkJCWxpc3RfZGVsKCZrZXllbnRyeS0+bGlzdCk7CisJCQlrZnJlZShrZXllbnRyeSk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKKworCWlmIChvbGRfa2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpIHsKKwkJbmV3X2tleWVudHJ5LT5rZXkuc2NhbmNvZGUgPSBzY2FuY29kZTsKKwkJbmV3X2tleWVudHJ5LT5rZXkua2V5Y29kZSA9IGtleWNvZGU7CisJCWxpc3RfYWRkKCZuZXdfa2V5ZW50cnktPmxpc3QsICZkYXRhLT5rZXl0YWJsZSk7CisJfSBlbHNlIHsKKwkJa2ZyZWUobmV3X2tleWVudHJ5KTsKKwkJY2xlYXJfYml0KG9sZF9rZXljb2RlLCBkZXYtPmtleWJpdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa2V5ZW50cnksICZkYXRhLT5rZXl0YWJsZSwgbGlzdCkgeworCQkJaWYgKGtleWVudHJ5LT5rZXkua2V5Y29kZSA9PSBvbGRfa2V5Y29kZSkgeworCQkJCXNldF9iaXQob2xkX2tleWNvZGUsIGRldi0+a2V5Yml0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaW1lciBmdW5jdGlvbiB0byByZXBvcnQga2V5dXAgZXZlbnQgc29tZSB0aW1lIGFmdGVyIGtleWRvd24gaXMKKyAqIHJlcG9ydGVkIGJ5IHRoZSBJU1IuCisgKi8KK3N0YXRpYyB2b2lkCit3YmNpcl9rZXl1cCh1bnNpZ25lZCBsb25nIGNvb2tpZSkKK3sKKwlzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgd2JjaXJfZGF0YSAqKWNvb2tpZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBkYXRhLT5rZXl1cF9qaWZmaWVzIGlzIHVzZWQgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIGlmIGEKKwkgKiBoYXJkd2FyZSBpbnRlcnJ1cHQgb2NjdXJzIGF0IHRoaXMgcG9pbnQgYW5kIHRoZSBrZXl1cCB0aW1lcgorCSAqIGV2ZW50IGlzIG1vdmVkIGZ1cnRoZXIgaW50byB0aGUgZnV0dXJlIGFzIGEgcmVzdWx0LgorCSAqCisJICogVGhlIHRpbWVyIHdpbGwgdGhlbiBiZSByZWFjdGl2YXRlZCBhbmQgdGhpcyBmdW5jdGlvbiBjYWxsZWQKKwkgKiBhZ2FpbiBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGV4aXQgZ3JhY2VmdWxseSBpbiB0aGF0IGNhc2UKKwkgKiB0byBhbGxvdyB0aGUgaW5wdXQgc3Vic3lzdGVtIHRvIGRvIGl0cyBhdXRvLXJlcGVhdCBtYWdpYyBvcgorCSAqIGEga2V5dXAgZXZlbnQgbWlnaHQgZm9sbG93IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBrZXlkb3duLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndiY2lyX2xvY2ssIGZsYWdzKTsKKworCWlmICh0aW1lX2lzX2FmdGVyX2VxX2ppZmZpZXMoZGF0YS0+a2V5dXBfamlmZmllcykgJiYgZGF0YS0+a2V5cHJlc3NlZCkgeworCQlkYXRhLT5rZXlwcmVzc2VkID0gMDsKKwkJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+cnh0cmlnZ2VyLCBMRURfT0ZGKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkYXRhLT5pbnB1dF9kZXYsIGRhdGEtPmxhc3Rfa2V5Y29kZSwgMCk7CisJCWlucHV0X3N5bmMoZGF0YS0+aW5wdXRfZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YmNpcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCit3YmNpcl9rZXlkb3duKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhLCB1MzIgc2NhbmNvZGUsIHU4IHRvZ2dsZSkKK3sKKwl1bnNpZ25lZCBpbnQga2V5Y29kZTsKKworCS8qIFJlcGVhdD8gKi8KKwlpZiAoZGF0YS0+bGFzdF9zY2FuY29kZSA9PSBzY2FuY29kZSAmJgorCSAgICBkYXRhLT5sYXN0X3RvZ2dsZSA9PSB0b2dnbGUgJiYKKwkgICAgZGF0YS0+a2V5cHJlc3NlZCkKKwkJZ290byBzZXRfdGltZXI7CisJZGF0YS0+bGFzdF9zY2FuY29kZSA9IHNjYW5jb2RlOworCisJLyogRG8gd2UgbmVlZCB0byByZWxlYXNlIGFuIG9sZCBrZXlwcmVzcz8gKi8KKwlpZiAoZGF0YS0+a2V5cHJlc3NlZCkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2RldiwgZGF0YS0+bGFzdF9rZXljb2RlLCAwKTsKKwkJaW5wdXRfc3luYyhkYXRhLT5pbnB1dF9kZXYpOworCQlkYXRhLT5rZXlwcmVzc2VkID0gMDsKKwl9CisKKwkvKiBSZXBvcnQgc2NhbmNvZGUgKi8KKwlpbnB1dF9ldmVudChkYXRhLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4sIChpbnQpc2NhbmNvZGUpOworCisJLyogRG8gd2Uga25vdyB0aGlzIHNjYW5jb2RlPyAqLworCWtleWNvZGUgPSB3YmNpcl9kb19nZXRrZXljb2RlKGRhdGEsIHNjYW5jb2RlKTsKKwlpZiAoa2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpCisJCWdvdG8gc2V0X3RpbWVyOworCisJLyogUmVnaXN0ZXIgYSBrZXlwcmVzcyAqLworCWlucHV0X3JlcG9ydF9rZXkoZGF0YS0+aW5wdXRfZGV2LCBrZXljb2RlLCAxKTsKKwlkYXRhLT5rZXlwcmVzc2VkID0gMTsKKwlkYXRhLT5sYXN0X2tleWNvZGUgPSBrZXljb2RlOworCWRhdGEtPmxhc3RfdG9nZ2xlID0gdG9nZ2xlOworCitzZXRfdGltZXI6CisJaW5wdXRfc3luYyhkYXRhLT5pbnB1dF9kZXYpOworCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwKKwkJCSAgZGF0YS0+a2V5cHJlc3NlZCA/IExFRF9GVUxMIDogTEVEX09GRik7CisJZGF0YS0+a2V5dXBfamlmZmllcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElSX0tFWVBSRVNTX1RJTUVPVVQpOworCW1vZF90aW1lcigmZGF0YS0+dGltZXJfa2V5dXAsIGRhdGEtPmtleXVwX2ppZmZpZXMpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSVIgUEFSU0lORyBGVU5DVElPTlMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc2V0cyBhbGwgaXJkYXRhICovCitzdGF0aWMgdm9pZAord2JjaXJfcmVzZXRfaXJkYXRhKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQoreworCW1lbXNldChkYXRhLT5pcmRhdGEsIDAsIHNpemVvZihkYXRhLT5pcmRhdGEpKTsKKwlkYXRhLT5pcmRhdGFfY291bnQgPSAwOworCWRhdGEtPmlyZGF0YV9vZmYgPSAwOworCWRhdGEtPmlyZGF0YV9lcnJvciA9IDA7Cit9CisKKy8qIEFkZHMgb25lIGJpdCBvZiBpcmRhdGEgKi8KK3N0YXRpYyB2b2lkCithZGRfaXJkYXRhX2JpdChzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgaW50IHNldCkKK3sKKwlpZiAoZGF0YS0+aXJkYXRhX2NvdW50ID49IHNpemVvZihkYXRhLT5pcmRhdGEpICogOCkgeworCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOworCQlyZXR1cm47CisJfQorCisJaWYgKHNldCkKKwkJX19zZXRfYml0KGRhdGEtPmlyZGF0YV9jb3VudCwgZGF0YS0+aXJkYXRhKTsKKwlkYXRhLT5pcmRhdGFfY291bnQrKzsKK30KKworLyogR2V0cyBjb3VudCBiaXRzIG9mIGlyZGF0YSAqLworc3RhdGljIHUxNgorZ2V0X2JpdHMoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGludCBjb3VudCkKK3sKKwl1MTYgdmFsID0gMHgwOworCisJaWYgKGRhdGEtPmlyZGF0YV9jb3VudCAtIGRhdGEtPmlyZGF0YV9vZmYgPCBjb3VudCkgeworCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOworCQlyZXR1cm4gMHgwOworCX0KKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdmFsIDw8PSAxOworCQlpZiAodGVzdF9iaXQoZGF0YS0+aXJkYXRhX29mZiwgZGF0YS0+aXJkYXRhKSkKKwkJCXZhbCB8PSAweDE7CisJCWNvdW50LS07CisJCWRhdGEtPmlyZGF0YV9vZmYrKzsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBSZWFkcyAxNiBjZWxscyBhbmQgY29udmVydHMgdGhlbSB0byBhIGJ5dGUgKi8KK3N0YXRpYyB1OAord2JjaXJfcmM2Y2VsbHNfdG9fYnl0ZShzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKK3sKKwl1MTYgcmF3ID0gZ2V0X2JpdHMoZGF0YSwgMTYpOworCXU4IHZhbCA9IDB4MDA7CisJaW50IGJpdDsKKworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJc3dpdGNoIChyYXcgJiAweDAzKSB7CisJCWNhc2UgMHgwMToKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQl2YWwgfD0gKDB4MDEgPDwgYml0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGF0YS0+aXJkYXRhX2Vycm9yID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXJhdyA+Pj0gMjsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBEZWNvZGVzIGEgbnVtYmVyIG9mIGJpdHMgZnJvbSByYXcgUkM1IGRhdGEgKi8KK3N0YXRpYyB1OAord2JjaXJfZ2V0X3JjNWJpdHMoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1MTYgcmF3ID0gZ2V0X2JpdHMoZGF0YSwgY291bnQgKiAyKTsKKwl1OCB2YWwgPSAweDAwOworCWludCBiaXQ7CisKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IGNvdW50OyBiaXQrKykgeworCQlzd2l0Y2ggKHJhdyAmIDB4MDMpIHsKKwkJY2FzZSAweDAxOgorCQkJdmFsIHw9ICgweDAxIDw8IGJpdCk7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJcmF3ID4+PSAyOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCit3YmNpcl9wYXJzZV9yYzYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKK3sKKwkvKgorCSAqIE5vcm1hbCBiaXRzIGFyZSBtYW5jaGVzdGVyIGNvZGVkIGFzIGZvbGxvd3M6CisJICogY2VsbDAgKyBjZWxsMSA9IGxvZ2ljICIwIgorCSAqIGNlbGwxICsgY2VsbDAgPSBsb2dpYyAiMSIKKwkgKgorCSAqIFRoZSBJUiBwdWxzZSBoYXMgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgorCSAqCisJICogTGVhZGVyCQktIDYgKiBjZWxsMSAtIGRpc2NhcmRlZAorCSAqIEdhcCAgICAJCS0gMiAqIGNlbGwwIC0gZGlzY2FyZGVkCisJICogU3RhcnQgYml0CQktIE5vcm1hbCBDb2RpbmcgLSBhbHdheXMgIjEiCisJICogTW9kZSBCaXQgMiAtIDAJLSBOb3JtYWwgQ29kaW5nCisJICogVG9nZ2xlIGJpdAkJLSBOb3JtYWwgQ29kaW5nIHdpdGggZG91YmxlIGJpdCB0aW1lLAorCSAqCQkJICBlLmcuIGNlbGwwICsgY2VsbDAgKyBjZWxsMSArIGNlbGwxCisJICoJCQkgIG1lYW5zIGxvZ2ljICIwIi4KKwkgKgorCSAqIFRoZSByZXN0IGRlcGVuZHMgb24gdGhlIG1vZGUsIHRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIGtub3duOgorCSAqCisJICogTU9ERSAwOgorCSAqICBBZGRyZXNzIEJpdCA3IC0gMAktIE5vcm1hbCBDb2RpbmcKKwkgKiAgQ29tbWFuZCBCaXQgNyAtIDAJLSBOb3JtYWwgQ29kaW5nCisJICoKKwkgKiBNT0RFIDY6CisJICogIFRoZSBhYm92ZSBUb2dnbGUgQml0IGlzIHVzZWQgYXMgYSBzdWJtb2RlIGJpdCwgMCA9IEEsIDEgPSBCLgorCSAqICBTdWJtb2RlIEIgaXMgZm9yIHBvaW50aW5nIGRldmljZXMsIG9ubHkgcmVtb3RlcyB1c2luZyBzdWJtb2RlIEEKKwkgKiAgYXJlIHN1cHBvcnRlZC4KKwkgKgorCSAqICBDdXN0b21lciByYW5nZSBiaXQJLSAwID0+IEN1c3RvbWVyID0gNyBiaXRzLCAwLi4uMTI3CisJICogICAgICAgICAgICAgICAgICAgICAgICAxID0+IEN1c3RvbWVyID0gMTUgYml0cywgMzI3NjguLi42NTUzNQorCSAqICBDdXN0b21lciBCaXRzCS0gTm9ybWFsIENvZGluZworCSAqCisJICogIEN1c3RvbWVyIGNvZGVzIGFyZSBhbGxvY2F0ZWQgYnkgUGhpbGlwcy4gVGhlIHJlc3Qgb2YgdGhlIGJpdHMKKwkgKiAgYXJlIGN1c3RvbWVyIGRlcGVuZGVudC4gVGhlIGZvbGxvd2luZyBpcyBjb21tb25seSB1c2VkIChhbmQgdGhlCisJICogIG9ubHkgc3VwcG9ydGVkIGNvbmZpZyk6CisJICoKKwkgKiAgVG9nZ2xlIEJpdAkJLSBOb3JtYWwgQ29kaW5nCisJICogIEFkZHJlc3MgQml0IDYgLSAwCS0gTm9ybWFsIENvZGluZworCSAqICBDb21tYW5kIEJpdCA3IC0gMAktIE5vcm1hbCBDb2RpbmcKKwkgKgorCSAqIEFsbCBtb2RlcyBhcmUgZm9sbG93ZWQgYnkgYXQgbGVhc3QgNiAqIGNlbGwwLgorCSAqCisJICogTU9ERSAwIG1zZ2xlbjoKKwkgKiAgMSAqIDIgKHN0YXJ0IGJpdCkgKyAzICogMiAobW9kZSkgKyAyICogMiAodG9nZ2xlKSArCisJICogIDggKiAyIChhZGRyZXNzKSArIDggKiAyIChjb21tYW5kKSA9CisJICogIDQ0IGNlbGxzCisJICoKKwkgKiBNT0RFIDZBIG1zZ2xlbjoKKwkgKiAgMSAqIDIgKHN0YXJ0IGJpdCkgKyAzICogMiAobW9kZSkgKyAyICogMiAoc3VibW9kZSkgKworCSAqICAxICogMiAoY3VzdG9tZXIgcmFuZ2UgYml0KSArIDcvMTUgKiAyIChjdXN0b21lciBiaXRzKSArCisJICogIDEgKiAyICh0b2dnbGUgYml0KSArIDcgKiAyIChhZGRyZXNzKSArIDggKiAyIChjb21tYW5kKSA9CisJICogIDYwIC0gNzYgY2VsbHMKKwkgKi8KKwl1OCBtb2RlOworCXU4IHRvZ2dsZTsKKwl1MTYgY3VzdG9tZXIgPSAweDA7CisJdTggYWRkcmVzczsKKwl1OCBjb21tYW5kOworCXUzMiBzY2FuY29kZTsKKworCS8qIExlYWRlciBtYXJrICovCisJd2hpbGUgKGdldF9iaXRzKGRhdGEsIDEpICYmICFkYXRhLT5pcmRhdGFfZXJyb3IpCisJCS8qIERvIG5vdGhpbmcgKi87CisKKwkvKiBMZWFkZXIgc3BhY2UgKi8KKwlpZiAoZ2V0X2JpdHMoZGF0YSwgMSkpIHsKKwkJZGV2X2RiZyhkZXYsICJSQzYgLSBJbnZhbGlkIGxlYWRlciBzcGFjZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTdGFydCBiaXQgKi8KKwlpZiAoZ2V0X2JpdHMoZGF0YSwgMikgIT0gMHgwMikgeworCQlkZXZfZGJnKGRldiwgIlJDNiAtIEludmFsaWQgc3RhcnQgYml0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1vZGUgKi8KKwltb2RlID0gZ2V0X2JpdHMoZGF0YSwgNik7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAweDE1OiAvKiAwMTAxMDEgPSBiMDAwICovCisJCW1vZGUgPSAwOworCQlicmVhazsKKwljYXNlIDB4Mjk6IC8qIDEwMTAwMSA9IGIxMTAgKi8KKwkJbW9kZSA9IDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoZGV2LCAiUkM2IC0gSW52YWxpZCBtb2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRvZ2dsZSBiaXQgLyBTdWJtb2RlIGJpdCAqLworCXRvZ2dsZSA9IGdldF9iaXRzKGRhdGEsIDQpOworCXN3aXRjaCAodG9nZ2xlKSB7CisJY2FzZSAweDAzOgorCQl0b2dnbGUgPSAwOworCQlicmVhazsKKwljYXNlIDB4MEM6CisJCXRvZ2dsZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoZGV2LCAiUkM2IC0gVG9nZ2xlIGJpdCBlcnJvclxuIik7CisJCWJyZWFrOworCX0KKworCS8qIEN1c3RvbWVyICovCisJaWYgKG1vZGUgPT0gNikgeworCQlpZiAodG9nZ2xlICE9IDApIHsKKwkJCWRldl9kYmcoZGV2LCAiUkM2QiAtIE5vdCBTdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJY3VzdG9tZXIgPSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOworCisJCWlmIChjdXN0b21lciAmIDB4ODApIHsKKwkJCS8qIDE1IGJpdCBjdXN0b21lciB2YWx1ZSAqLworCQkJY3VzdG9tZXIgPDw9IDg7CisJCQljdXN0b21lciB8PSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOworCQl9CisJfQorCisJLyogQWRkcmVzcyAqLworCWFkZHJlc3MgPSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOworCWlmIChtb2RlID09IDYpIHsKKwkJdG9nZ2xlID0gYWRkcmVzcyA+PiA3OworCQlhZGRyZXNzICY9IDB4N0Y7CisJfQorCisJLyogQ29tbWFuZCAqLworCWNvbW1hbmQgPSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOworCisJLyogQ3JlYXRlIHNjYW5jb2RlICovCisJc2NhbmNvZGUgPSAgY29tbWFuZDsKKwlzY2FuY29kZSB8PSBhZGRyZXNzIDw8IDg7CisJc2NhbmNvZGUgfD0gY3VzdG9tZXIgPDwgMTY7CisKKwkvKiBMYXN0IHNhbml0eSBjaGVjayAqLworCWlmIChkYXRhLT5pcmRhdGFfZXJyb3IpIHsKKwkJZGV2X2RiZyhkZXYsICJSQzYgLSBDZWxsIGVycm9yKHMpXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9pbmZvKGRldiwgIklSLVJDNiBhZCAweCUwMlggY20gMHglMDJYIGN1IDB4JTA0WCAiCisJCSJ0b2dnbGUgJXUgbW9kZSAldSBzY2FuIDB4JTA4WFxuIiwKKwkJYWRkcmVzcywKKwkJY29tbWFuZCwKKwkJY3VzdG9tZXIsCisJCSh1bnNpZ25lZCBpbnQpdG9nZ2xlLAorCQkodW5zaWduZWQgaW50KW1vZGUsCisJCXNjYW5jb2RlKTsKKworCXdiY2lyX2tleWRvd24oZGF0YSwgc2NhbmNvZGUsIHRvZ2dsZSk7Cit9CisKK3N0YXRpYyB2b2lkCit3YmNpcl9wYXJzZV9yYzUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKK3sKKwkvKgorCSAqIEJpdHMgYXJlIG1hbmNoZXN0ZXIgY29kZWQgYXMgZm9sbG93czoKKwkgKiBjZWxsMSArIGNlbGwwID0gbG9naWMgIjAiCisJICogY2VsbDAgKyBjZWxsMSA9IGxvZ2ljICIxIgorCSAqIChpLmUuIHRoZSByZXZlcnNlIG9mIFJDNikKKwkgKgorCSAqIFN0YXJ0IGJpdCAxCQktICIxIiAtIGRpc2NhcmRlZAorCSAqIFN0YXJ0IGJpdCAyCQktIE11c3QgYmUgaW52ZXJ0ZWQgdG8gZ2V0IGNvbW1hbmQgYml0IDYKKwkgKiBUb2dnbGUgYml0CisJICogQWRkcmVzcyBCaXQgNCAtIDAKKwkgKiBDb21tYW5kIEJpdCA1IC0gMAorCSAqLworCXU4IHRvZ2dsZTsKKwl1OCBhZGRyZXNzOworCXU4IGNvbW1hbmQ7CisJdTMyIHNjYW5jb2RlOworCisJLyogU3RhcnQgYml0IDEgKi8KKwlpZiAoIWdldF9iaXRzKGRhdGEsIDEpKSB7CisJCWRldl9kYmcoZGV2LCAiUkM1IC0gSW52YWxpZCBzdGFydCBiaXRcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogU3RhcnQgYml0IDIgKi8KKwlpZiAoIXdiY2lyX2dldF9yYzViaXRzKGRhdGEsIDEpKQorCQljb21tYW5kID0gMHg0MDsKKwllbHNlCisJCWNvbW1hbmQgPSAweDAwOworCisJdG9nZ2xlICAgPSB3YmNpcl9nZXRfcmM1Yml0cyhkYXRhLCAxKTsKKwlhZGRyZXNzICA9IHdiY2lyX2dldF9yYzViaXRzKGRhdGEsIDUpOworCWNvbW1hbmQgfD0gd2JjaXJfZ2V0X3JjNWJpdHMoZGF0YSwgNik7CisJc2NhbmNvZGUgPSBhZGRyZXNzIDw8IDcgfCBjb21tYW5kOworCisJLyogTGFzdCBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoZGF0YS0+aXJkYXRhX2Vycm9yKSB7CisJCWRldl9kYmcoZGV2LCAiUkM1IC0gSW52YWxpZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9kYmcoZGV2LCAiSVItUkM1IGFkICV1IGNtICV1IHQgJXUgcyAldVxuIiwKKwkJKHVuc2lnbmVkIGludClhZGRyZXNzLAorCQkodW5zaWduZWQgaW50KWNvbW1hbmQsCisJCSh1bnNpZ25lZCBpbnQpdG9nZ2xlLAorCQkodW5zaWduZWQgaW50KXNjYW5jb2RlKTsKKworCXdiY2lyX2tleWRvd24oZGF0YSwgc2NhbmNvZGUsIHRvZ2dsZSk7Cit9CisKK3N0YXRpYyB2b2lkCit3YmNpcl9wYXJzZV9uZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKK3sKKwkvKgorCSAqIEVhY2ggYml0IHJlcHJlc2VudHMgNTYwIHVzLgorCSAqCisJICogTGVhZGVyCQktIDkgbXMgYnVyc3QKKwkgKiBHYXAJCQktIDQuNSBtcyBzaWxlbmNlCisJICogQWRkcmVzczEgYml0IDAgLSA3CS0gQWRkcmVzcyAxCisJICogQWRkcmVzczIgYml0IDAgLSA3CS0gQWRkcmVzcyAyCisJICogQ29tbWFuZDEgYml0IDAgLSA3CS0gQ29tbWFuZCAxCisJICogQ29tbWFuZDIgYml0IDAgLSA3CS0gQ29tbWFuZCAyCisJICoKKwkgKiBOb3RlIHRoZSBiaXQgb3JkZXIhCisJICoKKwkgKiBXaXRoIHRoZSBvbGQgTkVDIHByb3RvY29sLCBBZGRyZXNzMiB3YXMgdGhlIGludmVyc2Ugb2YgQWRkcmVzczEKKwkgKiBhbmQgQ29tbWFuZDIgd2FzIHRoZSBpbnZlcnNlIG9mIENvbW1hbmQxIGFuZCB3ZXJlIHVzZWQgYXMKKwkgKiBhbiBlcnJvciBjaGVjay4KKwkgKgorCSAqIFdpdGggTkVDIGV4dGVuZGVkLCBBZGRyZXNzMSBpcyB0aGUgTFNCIG9mIHRoZSBBZGRyZXNzIGFuZAorCSAqIEFkZHJlc3MyIGlzIHRoZSBNU0IsIENvbW1hbmQgcGFyc2luZyByZW1haW5zIHVuY2hhbmdlZC4KKwkgKgorCSAqIEEgcmVwZWF0IG1lc3NhZ2UgaXMgY29kZWQgYXM6CisJICogTGVhZGVyCQktIDkgbXMgYnVyc3QKKwkgKiBHYXAJCQktIDIuMjUgbXMgc2lsZW5jZQorCSAqIFJlcGVhdAkJLSA1NjAgdXMgYWN0aXZlCisJICovCisJdTggYWRkcmVzczE7CisJdTggYWRkcmVzczI7CisJdTggY29tbWFuZDE7CisJdTggY29tbWFuZDI7CisJdTE2IGFkZHJlc3M7CisJdTMyIHNjYW5jb2RlOworCisJLyogTGVhZGVyIG1hcmsgKi8KKwl3aGlsZSAoZ2V0X2JpdHMoZGF0YSwgMSkgJiYgIWRhdGEtPmlyZGF0YV9lcnJvcikKKwkJLyogRG8gbm90aGluZyAqLzsKKworCS8qIExlYWRlciBzcGFjZSAqLworCWlmIChnZXRfYml0cyhkYXRhLCA0KSkgeworCQlkZXZfZGJnKGRldiwgIk5FQyAtIEludmFsaWQgbGVhZGVyIHNwYWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlcGVhdD8gKi8KKwlpZiAoZ2V0X2JpdHMoZGF0YSwgMSkpIHsKKwkJaWYgKCFkYXRhLT5rZXlwcmVzc2VkKSB7CisJCQlkZXZfZGJnKGRldiwgIk5FQyAtIFN0cmF5IHJlcGVhdCBtZXNzYWdlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRldl9kYmcoZGV2LCAiSVItTkVDIHJlcGVhdCBzICV1XG4iLAorCQkJKHVuc2lnbmVkIGludClkYXRhLT5sYXN0X3NjYW5jb2RlKTsKKworCQl3YmNpcl9rZXlkb3duKGRhdGEsIGRhdGEtPmxhc3Rfc2NhbmNvZGUsIGRhdGEtPmxhc3RfdG9nZ2xlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlbWFpbmluZyBsZWFkZXIgc3BhY2UgKi8KKwlpZiAoZ2V0X2JpdHMoZGF0YSwgMykpIHsKKwkJZGV2X2RiZyhkZXYsICJORUMgLSBJbnZhbGlkIGxlYWRlciBzcGFjZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlhZGRyZXNzMSAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKKwlhZGRyZXNzMiAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKKwljb21tYW5kMSAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKKwljb21tYW5kMiAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChkYXRhLT5pcmRhdGFfZXJyb3IpIHsKKwkJZGV2X2RiZyhkZXYsICJORUMgLSBJbnZhbGlkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgY29tbWFuZCB2YWxpZGl0eSAqLworCWlmIChjb21tYW5kMSAhPSB+Y29tbWFuZDIpIHsKKwkJZGV2X2RiZyhkZXYsICJORUMgLSBDb21tYW5kIGJ5dGVzIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGZvciBleHRlbmRlZCBORUMgcHJvdG9jb2wgKi8KKwlhZGRyZXNzID0gYWRkcmVzczE7CisJaWYgKGFkZHJlc3MxICE9IH5hZGRyZXNzMikKKwkJYWRkcmVzcyB8PSBhZGRyZXNzMiA8PCA4OworCisJc2NhbmNvZGUgPSBhZGRyZXNzIDw8IDggfCBjb21tYW5kMTsKKworCWRldl9kYmcoZGV2LCAiSVItTkVDIGFkICV1IGNtICV1IHMgJXVcbiIsCisJCSh1bnNpZ25lZCBpbnQpYWRkcmVzcywKKwkJKHVuc2lnbmVkIGludCljb21tYW5kMSwKKwkJKHVuc2lnbmVkIGludClzY2FuY29kZSk7CisKKwl3YmNpcl9rZXlkb3duKGRhdGEsIHNjYW5jb2RlLCAhZGF0YS0+bGFzdF90b2dnbGUpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSU5URVJSVVBUIEZVTkNUSU9OUworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlycXJldHVybl90Cit3YmNpcl9pcnFfaGFuZGxlcihpbnQgaXJxbm8sIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlID0gY29va2llOworCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRldmljZS0+ZGV2OworCXU4IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGlyZGF0YVs4XTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaHc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2JjaXJfbG9jaywgZmxhZ3MpOworCisJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKKworCXN0YXR1cyA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRUlSKTsKKworCWlmICghKHN0YXR1cyAmIChXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2JjaXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKHN0YXR1cyAmIFdCQ0lSX0lSUV9FUlIpCisJCWRhdGEtPmlyZGF0YV9lcnJvciA9IDE7CisKKwlpZiAoIShzdGF0dXMgJiBXQkNJUl9JUlFfUlgpKQorCQlnb3RvIG91dDsKKworCS8qIFNpbmNlIFJYSERMRVYgaXMgc2V0LCBhdCBsZWFzdCA4IGJ5dGVzIGFyZSBpbiB0aGUgRklGTyAqLworCWluc2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSwgJmlyZGF0YVswXSwgOCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGlyZGF0YSk7IGkrKykgeworCQlodyA9IGh3ZWlnaHQ4KGlyZGF0YVtpXSk7CisJCWlmIChodyA+IDQpCisJCQlhZGRfaXJkYXRhX2JpdChkYXRhLCAwKTsKKwkJZWxzZQorCQkJYWRkX2lyZGF0YV9iaXQoZGF0YSwgMSk7CisKKwkJaWYgKGh3ID09IDgpCisJCQlkYXRhLT5pZGxlX2NvdW50Kys7CisJCWVsc2UKKwkJCWRhdGEtPmlkbGVfY291bnQgPSAwOworCX0KKworCWlmIChkYXRhLT5pZGxlX2NvdW50ID4gV0JDSVJfTUFYX0lETEVfQllURVMpIHsKKwkJLyogU2V0IFJYSU5BQ1RJVkUuLi4gKi8KKwkJb3V0YihXQkNJUl9SWF9ESVNBQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CisKKwkJLyogLi4uYW5kIGRyYWluIHRoZSBGSUZPICovCisJCXdoaWxlIChpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUikgJiBXQkNJUl9SWF9BVkFJTCkKKwkJCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUlhEQVRBKTsKKworCQlkZXZfZGJnKGRldiwgIklSREFUQTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+aXJkYXRhX2NvdW50OyBpICs9IEJJVFNfUEVSX0xPTkcpCisJCQlkZXZfZGJnKGRldiwgIjB4JTA4bFhcbiIsIGRhdGEtPmlyZGF0YVtpL0JJVFNfUEVSX0xPTkddKTsKKworCQlzd2l0Y2ggKHByb3RvY29sKSB7CisJCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgorCQkJd2JjaXJfcGFyc2VfcmM1KGRldiwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CisJCQl3YmNpcl9wYXJzZV9yYzYoZGV2LCBkYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElSX1BST1RPQ09MX05FQzoKKwkJCXdiY2lyX3BhcnNlX25lYyhkZXYsIGRhdGEpOworCQkJYnJlYWs7CisJCX0KKworCQl3YmNpcl9yZXNldF9pcmRhdGEoZGF0YSk7CisJCWRhdGEtPmlkbGVfY291bnQgPSAwOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndiY2lyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTVVNQRU5EL1JFU1VNRSBGVU5DVElPTlMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCit3YmNpcl9zaHV0ZG93bihzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKKwlzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCWludCBkb193YWtlID0gMTsKKwl1OCBtYXRjaFsxMV07CisJdTggbWFza1sxMV07CisJdTggcmM2X2NzbCA9IDA7CisJaW50IGk7CisKKwltZW1zZXQobWF0Y2gsIDAsIHNpemVvZihtYXRjaCkpOworCW1lbXNldChtYXNrLCAwLCBzaXplb2YobWFzaykpOworCisJaWYgKHdha2Vfc2MgPT0gSU5WQUxJRF9TQ0FOQ09ERSB8fCAhZGV2aWNlX21heV93YWtldXAoZGV2KSkgeworCQlkb193YWtlID0gMDsKKwkJZ290byBmaW5pc2g7CisJfQorCisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgorCQlpZiAod2FrZV9zYyA+IDB4RkZGKSB7CisJCQlkb193YWtlID0gMDsKKwkJCWRldl9lcnIoZGV2LCAiUkM1IC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTWFzayA9IDEzIGJpdHMsIGV4IHRvZ2dsZSAqLworCQltYXNrWzBdID0gMHhGRjsKKwkJbWFza1sxXSA9IDB4MTc7CisKKwkJbWF0Y2hbMF0gID0gKHdha2Vfc2MgJiAweDAwM0YpOyAgICAgIC8qIDYgY29tbWFuZCBiaXRzICovCisJCW1hdGNoWzBdIHw9ICh3YWtlX3NjICYgMHgwMTgwKSA+PiAxOyAvKiAyIGFkZHJlc3MgYml0cyAqLworCQltYXRjaFsxXSAgPSAod2FrZV9zYyAmIDB4MEUwMCkgPj4gOTsgLyogMyBhZGRyZXNzIGJpdHMgKi8KKwkJaWYgKCEod2FrZV9zYyAmIDB4MDA0MCkpICAgICAgICAgICAgIC8qIDJuZCBzdGFydCBiaXQgICovCisJCQltYXRjaFsxXSB8PSAweDEwOworCisJCWJyZWFrOworCisJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CisJCWlmICh3YWtlX3NjID4gMHhGRkZGRkYpIHsKKwkJCWRvX3dha2UgPSAwOworCQkJZGV2X2VycihkZXYsICJORUMgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQltYXNrWzBdID0gbWFza1sxXSA9IG1hc2tbMl0gPSBtYXNrWzNdID0gMHhGRjsKKworCQltYXRjaFsxXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGKSk7CisJCW1hdGNoWzBdID0gfm1hdGNoWzFdOworCisJCW1hdGNoWzNdID0gYml0cmV2OCgod2FrZV9zYyAmIDB4RkYwMCkgPj4gOCk7CisJCWlmICh3YWtlX3NjID4gMHhGRkZGKQorCQkJbWF0Y2hbMl0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRjAwMDApID4+IDE2KTsKKwkJZWxzZQorCQkJbWF0Y2hbMl0gPSB+bWF0Y2hbM107CisKKwkJYnJlYWs7CisKKwljYXNlIElSX1BST1RPQ09MX1JDNjoKKworCQlpZiAod2FrZV9yYzZtb2RlID09IDApIHsKKwkJCWlmICh3YWtlX3NjID4gMHhGRkZGKSB7CisJCQkJZG9fd2FrZSA9IDA7CisJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDb21tYW5kICovCisJCQltYXRjaFswXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDApOworCQkJbWFza1swXSAgPSAweEZGOworCQkJbWF0Y2hbMV0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKKwkJCW1hc2tbMV0gID0gMHhGRjsKKworCQkJLyogQWRkcmVzcyAqLworCQkJbWF0Y2hbMl0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA4KTsKKwkJCW1hc2tbMl0gID0gMHhGRjsKKwkJCW1hdGNoWzNdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxMik7CisJCQltYXNrWzNdICA9IDB4RkY7CisKKwkJCS8qIEhlYWRlciAqLworCQkJbWF0Y2hbNF0gPSAweDUwOyAvKiBtb2RlMSA9IG1vZGUwID0gMCwgaWdub3JlIHRvZ2dsZSAqLworCQkJbWFza1s0XSAgPSAweEYwOworCQkJbWF0Y2hbNV0gPSAweDA5OyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDAgKi8KKwkJCW1hc2tbNV0gID0gMHgwRjsKKworCQkJcmM2X2NzbCA9IDQ0OworCisJCX0gZWxzZSBpZiAod2FrZV9yYzZtb2RlID09IDYpIHsKKwkJCWkgPSAwOworCisJCQkvKiBDb21tYW5kICovCisJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICAwKTsKKwkJCW1hc2tbaSsrXSA9IDB4RkY7CisJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKKwkJCW1hc2tbaSsrXSA9IDB4RkY7CisKKwkJCS8qIEFkZHJlc3MgKyBUb2dnbGUgKi8KKwkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDgpOworCQkJbWFza1tpKytdID0gMHhGRjsKKwkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTIpOworCQkJbWFza1tpKytdID0gMHgzRjsKKworCQkJLyogQ3VzdG9tZXIgYml0cyA3IC0gMCAqLworCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxNik7CisJCQltYXNrW2krK10gPSAweEZGOworCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyMCk7CisJCQltYXNrW2krK10gPSAweEZGOworCisJCQlpZiAod2FrZV9zYyAmIDB4ODAwMDAwMDApIHsKKwkJCQkvKiBDdXN0b21lciByYW5nZSBiaXQgYW5kIGJpdHMgMTUgLSA4ICovCisJCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyNCk7CisJCQkJbWFza1tpKytdID0gMHhGRjsKKwkJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDI4KTsKKwkJCQltYXNrW2krK10gPSAweEZGOworCQkJCXJjNl9jc2wgPSA3NjsKKwkJCX0gZWxzZSBpZiAod2FrZV9zYyA8PSAweDAwN0ZGRkZGKSB7CisJCQkJcmM2X2NzbCA9IDYwOworCQkJfSBlbHNlIHsKKwkJCQlkb193YWtlID0gMDsKKwkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEhlYWRlciAqLworCQkJbWF0Y2hbaV0gID0gMHg5MzsgLyogbW9kZTEgPSBtb2RlMCA9IDEsIHN1Ym1vZGUgPSAwICovCisJCQltYXNrW2krK10gPSAweEZGOworCQkJbWF0Y2hbaV0gID0gMHgwQTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAxICovCisJCQltYXNrW2krK10gPSAweDBGOworCisJCX0gZWxzZSB7CisJCQlkb193YWtlID0gMDsKKwkJCWRldl9lcnIoZGV2LCAiUkM2IC0gSW52YWxpZCB3YWtlIG1vZGVcbiIpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkb193YWtlID0gMDsKKwkJYnJlYWs7CisJfQorCitmaW5pc2g6CisJaWYgKGRvX3dha2UpIHsKKwkJLyogU2V0IGNvbXBhcmUgYW5kIGNvbXBhcmUgbWFzayAqLworCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCwKKwkJCSAgICAgICBXQkNJUl9SRUdTRUxfQ09NUEFSRSB8IFdCQ0lSX1JFR19BRERSMCwKKwkJCSAgICAgICAweDNGKTsKKwkJb3V0c2IoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfREFUQSwgbWF0Y2gsIDExKTsKKwkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfSU5ERVgsCisJCQkgICAgICAgV0JDSVJfUkVHU0VMX01BU0sgfCBXQkNJUl9SRUdfQUREUjAsCisJCQkgICAgICAgMHgzRik7CisJCW91dHNiKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0RBVEEsIG1hc2ssIDExKTsKKworCQkvKiBSQzYgQ29tcGFyZSBTdHJpbmcgTGVuICovCisJCW91dGIocmM2X2NzbCwgZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1NMKTsKKworCQkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLworCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOworCisJCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgU2V0IE1BVENIX0VOICovCisJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAxLCAweDA3KTsKKworCQkvKiBTZXQgQ0VJUl9FTiAqLworCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDEsIDB4MDEpOworCisJfSBlbHNlIHsKKwkJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLworCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CisKKwkJLyogQ2xlYXIgQ0VJUl9FTiAqLworCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDAsIDB4MDEpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCW91dGIoV0JDSVJfSVJRX05PTkUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOworfQorCitzdGF0aWMgaW50Cit3YmNpcl9zdXNwZW5kKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl3YmNpcl9zaHV0ZG93bihkZXZpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YmNpcl9yZXN1bWUoc3RydWN0IHBucF9kZXYgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCisJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLworCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKKworCS8qIENsZWFyIENFSVJfRU4gKi8KKwl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDAsIDB4MDEpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwl3YmNpcl9yZXNldF9pcmRhdGEoZGF0YSk7CisJb3V0YihXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKKworCXJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU0VUVVAvSU5JVCBGVU5DVElPTlMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCit3YmNpcl9jZmdfY2VpcihzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKK3sKKwl1OCB0bXA7CisKKwkvKiBTZXQgUFJPVF9TRUwsIFJYX0lOViwgQ2xlYXIgQ0VJUl9FTiAobmVlZGVkIGZvciB0aGUgbGVkKSAqLworCXRtcCA9IHByb3RvY29sIDw8IDQ7CisJaWYgKGludmVydCkKKwkJdG1wIHw9IDB4MDg7CisJb3V0Yih0bXAsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCk7CisKKwkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLworCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CisKKwkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIENsZWFyIE1BVENIX0VOICovCisJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOworCisJLyogU2V0IFJDNSBjZWxsIHRpbWUgdG8gY29ycmVzcG9uZCB0byAzNiBrSHogKi8KKwl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DRkcxLCAweDRBLCAweDdGKTsKKworCS8qIFNldCBJUlRYX0lOViAqLworCWlmIChpbnZlcnQpCisJCW91dGIoMHgwNCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ0NUTCk7CisJZWxzZQorCQlvdXRiKDB4MDAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NDVEwpOworCisJLyoKKwkgKiBDbGVhciBJUiBMRUQsIHNldCBTUDMgY2xvY2sgdG8gMjRNaHoKKwkgKiBzZXQgU1AzX0lSUlhfU1cgdG8gYmluYXJ5IDAxLCBoZWxwZnVsbHkgbm90IGRvY3VtZW50ZWQKKwkgKi8KKwlvdXRiKDB4MTAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0Cit3YmNpcl9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlLCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKKwlzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKCEocG5wX3BvcnRfbGVuKGRldmljZSwgMCkgPT0gRUhGVU5DX0lPTUVNX0xFTiAmJgorCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDEpID09IFdBS0VVUF9JT01FTV9MRU4gJiYKKwkgICAgICBwbnBfcG9ydF9sZW4oZGV2aWNlLCAyKSA9PSBTUF9JT01FTV9MRU4pKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIGRhdGEpOworCisJZGF0YS0+ZWJhc2UgPSBwbnBfcG9ydF9zdGFydChkZXZpY2UsIDApOworCWRhdGEtPndiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAxKTsKKwlkYXRhLT5zYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMik7CisJZGF0YS0+aXJxID0gcG5wX2lycShkZXZpY2UsIDApOworCisJaWYgKGRhdGEtPndiYXNlID09IDAgfHwgZGF0YS0+ZWJhc2UgPT0gMCB8fAorCSAgICBkYXRhLT5zYmFzZSA9PSAwIHx8IGRhdGEtPmlycSA9PSAwKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOworCQlnb3RvIGV4aXRfZnJlZV9kYXRhOworCX0KKworCWRldl9kYmcoJmRldmljZS0+ZGV2LCAiRm91bmQgZGV2aWNlICIKKwkJIih3OiAweCVsWCwgZTogMHglbFgsIHM6IDB4JWxYLCBpOiAldSlcbiIsCisJCWRhdGEtPndiYXNlLCBkYXRhLT5lYmFzZSwgZGF0YS0+c2Jhc2UsIGRhdGEtPmlycSk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOLCBEUlZOQU1FKSkgeworCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCisJCQlkYXRhLT53YmFzZSwgZGF0YS0+d2Jhc2UgKyBXQUtFVVBfSU9NRU1fTEVOIC0gMSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0X2ZyZWVfZGF0YTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOLCBEUlZOQU1FKSkgeworCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCisJCQlkYXRhLT5lYmFzZSwgZGF0YS0+ZWJhc2UgKyBFSEZVTkNfSU9NRU1fTEVOIC0gMSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0X3JlbGVhc2Vfd2Jhc2U7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOLCBEUlZOQU1FKSkgeworCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCisJCQlkYXRhLT5zYmFzZSwgZGF0YS0+c2Jhc2UgKyBTUF9JT01FTV9MRU4gLSAxKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGV4aXRfcmVsZWFzZV9lYmFzZTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShkYXRhLT5pcnEsIHdiY2lyX2lycV9oYW5kbGVyLAorCQkJICBJUlFGX0RJU0FCTEVELCBEUlZOQU1FLCBkZXZpY2UpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xhaW0gSVJRICV1XG4iLCBkYXRhLT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9yZWxlYXNlX3NiYXNlOworCX0KKworCWxlZF90cmlnZ2VyX3JlZ2lzdGVyX3NpbXBsZSgiY2lyLXR4IiwgJmRhdGEtPnR4dHJpZ2dlcik7CisJaWYgKCFkYXRhLT50eHRyaWdnZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2ZyZWVfaXJxOworCX0KKworCWxlZF90cmlnZ2VyX3JlZ2lzdGVyX3NpbXBsZSgiY2lyLXJ4IiwgJmRhdGEtPnJ4dHJpZ2dlcik7CisJaWYgKCFkYXRhLT5yeHRyaWdnZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X3VucmVnaXN0ZXJfdHh0cmlnZ2VyOworCX0KKworCWRhdGEtPmxlZC5uYW1lID0gImNpcjo6YWN0aXZpdHkiOworCWRhdGEtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSAiY2lyLXJ4IjsKKwlkYXRhLT5sZWQuYnJpZ2h0bmVzc19zZXQgPSB3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQ7CisJZGF0YS0+bGVkLmJyaWdodG5lc3NfZ2V0ID0gd2JjaXJfbGVkX2JyaWdodG5lc3NfZ2V0OworCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZGV2aWNlLT5kZXYsICZkYXRhLT5sZWQpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3J4dHJpZ2dlcjsKKworCWRhdGEtPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghZGF0YS0+aW5wdXRfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX2xlZDsKKwl9CisKKwlkYXRhLT5pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJZGF0YS0+aW5wdXRfZGV2LT5uYW1lID0gV0JDSVJfTkFNRTsKKwlkYXRhLT5pbnB1dF9kZXYtPnBoeXMgPSAid2JjaXIvY2lyMCI7CisJZGF0YS0+aW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJZGF0YS0+aW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gUENJX1ZFTkRPUl9JRF9XSU5CT05EOworCWRhdGEtPmlucHV0X2Rldi0+aWQucHJvZHVjdCA9IFdCQ0lSX0lEX0ZBTUlMWTsKKwlkYXRhLT5pbnB1dF9kZXYtPmlkLnZlcnNpb24gPSBXQkNJUl9JRF9DSElQOworCWRhdGEtPmlucHV0X2Rldi0+Z2V0a2V5Y29kZSA9IHdiY2lyX2dldGtleWNvZGU7CisJZGF0YS0+aW5wdXRfZGV2LT5zZXRrZXljb2RlID0gd2JjaXJfc2V0a2V5Y29kZTsKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShkYXRhLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4pOworCWlucHV0X3NldF9kcnZkYXRhKGRhdGEtPmlucHV0X2RldiwgZGF0YSk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZV9pbnB1dDsKKworCWRhdGEtPmxhc3Rfc2NhbmNvZGUgPSBJTlZBTElEX1NDQU5DT0RFOworCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5rZXl0YWJsZSk7CisJc2V0dXBfdGltZXIoJmRhdGEtPnRpbWVyX2tleXVwLCB3YmNpcl9rZXl1cCwgKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisKKwkvKiBMb2FkIGRlZmF1bHQga2V5bWFwcyAqLworCWlmIChwcm90b2NvbCA9PSBJUl9QUk9UT0NPTF9SQzYpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJjNl9kZWZfa2V5bWFwKTsgaSsrKSB7CisJCQllcnIgPSB3YmNpcl9zZXRrZXljb2RlKGRhdGEtPmlucHV0X2RldiwKKwkJCQkJICAgICAgIChpbnQpcmM2X2RlZl9rZXltYXBbaV0uc2NhbmNvZGUsCisJCQkJCSAgICAgICAoaW50KXJjNl9kZWZfa2V5bWFwW2ldLmtleWNvZGUpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9rZXlzOworCQl9CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKCZkZXZpY2UtPmRldiwgMSk7CisKKwl3YmNpcl9jZmdfY2VpcihkYXRhKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CisJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CisKKwkvKiBFbmFibGUgZXh0ZW5kZWQgbW9kZSAqLworCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMik7CisJb3V0YihXQkNJUl9FWFRfRU5BQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjEpOworCisJLyoKKwkgKiBDb25maWd1cmUgYmF1ZCBnZW5lcmF0b3IsIElSIGRhdGEgd2lsbCBiZSBzYW1wbGVkIGF0CisJICogYSBiaXRyYXRlIG9mOiAoMjRNaHogKiBwcmVzY2FsZXIpIC8gKGRpdmlzb3IgKiAxNikuCisJICoKKwkgKiBUaGUgRUNJUiByZWdpc3RlcnMgaW5jbHVkZSBhIGZsYWcgdG8gY2hhbmdlIHRoZQorCSAqIDI0TWh6IGNsb2NrIGZyZXEgdG8gNDhNaHouCisJICoKKwkgKiBJdCdzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBzcGVjcywgYnV0IGZpZm8gbGV2ZWxzCisJICogb3RoZXIgdGhhbiAxNiBzZWVtcyB0byBiZSB1bnN1cHBvcnRlZC4KKwkgKi8KKworCS8qIHByZXNjYWxlciAxLjAsIHR4L3J4IGZpZm8gbHZsIDE2ICovCisJb3V0YigweDMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjIpOworCisJLyogU2V0IGJhdWQgZGl2aXNvciB0byBnZW5lcmF0ZSBvbmUgYnl0ZSBwZXIgYml0L2NlbGwgKi8KKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CisJCW91dGIoMHhBNywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOworCQlicmVhazsKKwljYXNlIElSX1BST1RPQ09MX1JDNjoKKwkJb3V0YigweDUzLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CisJCWJyZWFrOworCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgorCQlvdXRiKDB4NjksIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKKwkJYnJlYWs7CisJfQorCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREgpOworCisJLyogU2V0IENFSVIgbW9kZSAqLworCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CisJb3V0YigweEMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTUNSKTsKKwlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUik7IC8qIENsZWFyIExTUiAqLworCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTVNSKTsgLyogQ2xlYXIgTVNSICovCisKKwkvKiBEaXNhYmxlIFJYIGRlbW9kLCBydW4tbGVuZ3RoIGVuY29kaW5nL2RlY29kaW5nLCBzZXQgZnJlcSBzcGFuICovCisJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKKwlvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SQ0NGRyk7CisKKwkvKiBEaXNhYmxlIHRpbWVyICovCisJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS180KTsKKwlvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMSk7CisKKwkvKiBFbmFibGUgTVNSIGludGVycnVwdCwgQ2xlYXIgQVVYX0lSWCAqLworCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNSk7CisJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjIpOworCisJLyogRGlzYWJsZSBDUkMgKi8KKwl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzYpOworCW91dGIoMHgyMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IzKTsKKworCS8qIFNldCBSWC9UWCAoZGUpbW9kdWxhdGlvbiBmcmVxLCBub3QgcmVhbGx5IHVzZWQgKi8KKwl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOworCW91dGIoMHhGMiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSUlhEQyk7CisJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJUWE1DKTsKKworCS8qIFNldCBpbnZlcnQgYW5kIHBpbiBkaXJlY3Rpb24gKi8KKwlpZiAoaW52ZXJ0KQorCQlvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNGRzQpOworCWVsc2UKKwkJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKKworCS8qIFNldCBGSUZPIHRocmVzaG9sZHMgKFJYID0gOCwgVFggPSAzKSwgcmVzZXQgUlgvVFggKi8KKwl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOworCW91dGIoMHg5NywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0ZDUik7CisKKwkvKiBDbGVhciBBVVggc3RhdHVzIGJpdHMgKi8KKwlvdXRiKDB4RTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19BU0NSKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJb3V0YihXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKKworCXJldHVybiAwOworCitleGl0X3VucmVnaXN0ZXJfa2V5czoKKwlpZiAoIWxpc3RfZW1wdHkoJmRhdGEtPmtleXRhYmxlKSkgeworCQlzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleTsKKwkJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXl0bXA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtleSwga2V5dG1wLCAmZGF0YS0+a2V5dGFibGUsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZrZXktPmxpc3QpOworCQkJa2ZyZWUoa2V5KTsKKwkJfQorCX0KKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkYXRhLT5pbnB1dF9kZXYpOworCS8qIENhbid0IGNhbGwgaW5wdXRfZnJlZV9kZXZpY2Ugb24gYW4gdW5yZWdpc3RlcmVkIGRldmljZSAqLworCWRhdGEtPmlucHV0X2RldiA9IE5VTEw7CitleGl0X2ZyZWVfaW5wdXQ6CisJaW5wdXRfZnJlZV9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKK2V4aXRfdW5yZWdpc3Rlcl9sZWQ6CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZCk7CitleGl0X3VucmVnaXN0ZXJfcnh0cmlnZ2VyOgorCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CitleGl0X3VucmVnaXN0ZXJfdHh0cmlnZ2VyOgorCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnR4dHJpZ2dlcik7CitleGl0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRhdGEtPmlycSwgZGV2aWNlKTsKK2V4aXRfcmVsZWFzZV9zYmFzZToKKwlyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKK2V4aXRfcmVsZWFzZV9lYmFzZToKKwlyZWxlYXNlX3JlZ2lvbihkYXRhLT5lYmFzZSwgRUhGVU5DX0lPTUVNX0xFTik7CitleGl0X3JlbGVhc2Vfd2Jhc2U6CisJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOworZXhpdF9mcmVlX2RhdGE6CisJa2ZyZWUoZGF0YSk7CisJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAord2JjaXJfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCit7CisJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleTsKKwlzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleXRtcDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CisJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CisKKwlkZWxfdGltZXJfc3luYygmZGF0YS0+dGltZXJfa2V5dXApOworCisJZnJlZV9pcnEoZGF0YS0+aXJxLCBkZXZpY2UpOworCisJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KKwl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOworCisJLyogQ2xlYXIgQ0VJUl9FTiAqLworCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMCwgMHgwMSk7CisKKwkvKiBDbGVhciBCVUZGX0VOLCBFTkRfRU4sIE1BVENIX0VOICovCisJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOworCisJLyogVGhpcyB3aWxsIGdlbmVyYXRlIGEga2V5dXAgZXZlbnQgaWYgbmVjZXNzYXJ5ICovCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKKworCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CisJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKKworCS8qIFRoaXMgaXMgb2sgc2luY2UgJmRhdGEtPmxlZCBpc24ndCBhY3R1YWxseSB1c2VkICovCisJd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0KCZkYXRhLT5sZWQsIExFRF9PRkYpOworCisJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOworCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOKTsKKwlyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrZXksIGtleXRtcCwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZrZXktPmxpc3QpOworCQlrZnJlZShrZXkpOworCX0KKworCWtmcmVlKGRhdGEpOworCisJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCB3YmNpcl9pZHNbXSA9IHsKKwl7ICJXRUMxMDIyIiwgMCB9LAorCXsgIiIsIDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCB3YmNpcl9pZHMpOworCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JjaXJfZHJpdmVyID0geworCS5uYW1lICAgICA9IFdCQ0lSX05BTUUsCisJLmlkX3RhYmxlID0gd2JjaXJfaWRzLAorCS5wcm9iZSAgICA9IHdiY2lyX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKHdiY2lyX3JlbW92ZSksCisJLnN1c3BlbmQgID0gd2JjaXJfc3VzcGVuZCwKKwkucmVzdW1lICAgPSB3YmNpcl9yZXN1bWUsCisJLnNodXRkb3duID0gd2JjaXJfc2h1dGRvd24KK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit3YmNpcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocHJvdG9jb2wpIHsKKwljYXNlIElSX1BST1RPQ09MX1JDNToKKwljYXNlIElSX1BST1RPQ09MX05FQzoKKwljYXNlIElSX1BST1RPQ09MX1JDNjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogSW52YWxpZCBwcm90b2NvbCBhcmd1bWVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3diY2lyX2V4aXQodm9pZCkKK3sKKwlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBTdXBlckkvTyBDb25zdW1lciBJUiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQod2JjaXJfaW5pdCk7Cittb2R1bGVfZXhpdCh3YmNpcl9leGl0KTsKKworCg==