LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDEwIERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KICoKICogIERlZGljYXRlZCB0byBteSBkYXVnaHRlciBNYXRpbGRhLCB3aXRob3V0IHdob3NlIGxvdmluZyBhdHRlbnRpb24gdGhpcwogKiAgZHJpdmVyIHdvdWxkIGhhdmUgYmVlbiBmaW5pc2hlZCBpbiBoYWxmIHRoZSB0aW1lIGFuZCB3aXRoIGEgZnJhY3Rpb24KICogIG9mIHRoZSBidWdzLgogKgogKiAgV3JpdHRlbiB1c2luZzoKICogICAgbyBXaW5ib25kIFdQQ0QzNzZJIGRhdGFzaGVldCBoZWxwZnVsbHkgcHJvdmlkZWQgYnkgSmVzc2UgQmFybmVzIGF0IEludGVsCiAqICAgIG8gTmF0U2VtaSBQQzg3MzM4L1BDOTczMzggZGF0YXNoZWV0IChmb3IgdGhlIHNlcmlhbCBwb3J0IHN0dWZmKQogKiAgICBvIERTRFQgZHVtcHMKICoKICogIFN1cHBvcnRlZCBmZWF0dXJlczoKICogICAgbyBJUiBSZWNlaXZlCiAqICAgIG8gSVIgVHJhbnNtaXQKICogICAgbyBXYWtlLU9uLUNJUiBmdW5jdGlvbmFsaXR5CiAqCiAqICBUbyBkbzoKICogICAgbyBMZWFybmluZwogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BucC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvbGVkcy5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CgojZGVmaW5lIERSVk5BTUUgIndpbmJvbmQtY2lyIgoKLyogQ0VJUiBXYWtlLVVwIFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+d2Jhc2UgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ1RMCTB4MDMgLyogQ0VJUiBSZWNlaXZlciBDb250cm9sCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9TVFMJMHgwNCAvKiBDRUlSIFJlY2VpdmVyIFN0YXR1cwkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfRVZfRU4JMHgwNSAvKiBDRUlSIFJlY2VpdmVyIEV2ZW50IEVuYWJsZQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DTlRMCTB4MDYgLyogQ0VJUiBSZWNlaXZlciBDb3VudGVyIExvdwkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DTlRICTB4MDcgLyogQ0VJUiBSZWNlaXZlciBDb3VudGVyIEhpZ2gJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfSU5ERVgJMHgwOCAvKiBDRUlSIFJlY2VpdmVyIEluZGV4CQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9EQVRBCTB4MDkgLyogQ0VJUiBSZWNlaXZlciBEYXRhCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DU0wJMHgwQSAvKiBDRUlSIFJlLiBDb21wYXJlIFN0cmxlbgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ0ZHMQkweDBCIC8qIENFSVIgUmUuIENvbmZpZ3VyYXRpb24gMQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DRkcyCTB4MEMgLyogQ0VJUiBSZS4gQ29uZmlndXJhdGlvbiAyCSovCgovKiBDRUlSIEVuaGFuY2VkIEZ1bmN0aW9uYWxpdHkgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT5lYmFzZSAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DVFMJMHgwMCAvKiBFbmhhbmNlZCBJUiBDb250cm9sIFN0YXR1cwkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMCTB4MDEgLyogSW5mcmFyZWQgQ291bnRlciBDb250cm9sCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NOVF9MTwkweDAyIC8qIEluZnJhcmVkIENvdW50ZXIgTFNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DTlRfSEkJMHgwMyAvKiBJbmZyYXJlZCBDb3VudGVyIE1TQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfSVJFTQkweDA0IC8qIEluZnJhcmVkIEVtaXR0ZXIgU3RhdHVzCQkqLwoKLyogU1AzIEJhbmtlZCBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPnNiYXNlICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JTUgkweDAzIC8qIEJhbmsgU2VsZWN0LCBhbGwgYmFua3MJCSovCgkJCQkgICAgICAvKiBCYW5rIDAJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JYREFUQQkweDAwIC8qIEZJRk8gUlggZGF0YSAocikJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19UWERBVEEJMHgwMCAvKiBGSUZPIFRYIGRhdGEgKHcpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSUVSCTB4MDEgLyogSW50ZXJydXB0IEVuYWJsZQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VJUgkweDAyIC8qIEV2ZW50IElkZW50aWZpY2F0aW9uIChyKQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRkNSCTB4MDIgLyogRklGTyBDb250cm9sICh3KQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX01DUgkweDA0IC8qIE1vZGUgQ29udHJvbAkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19MU1IJMHgwNSAvKiBMaW5rIFN0YXR1cwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19NU1IJMHgwNiAvKiBNb2RlbSBTdGF0dXMJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQVNDUgkweDA3IC8qIEF1eCBTdGF0dXMgYW5kIENvbnRyb2wJCSovCgkJCQkgICAgICAvKiBCYW5rIDIJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JHREwJMHgwMCAvKiBCYXVkIERpdmlzb3IgTFNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQkdESAkweDAxIC8qIEJhdWQgRGl2aXNvciBNU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19FWENSMQkweDAyIC8qIEV4dGVuZGVkIENvbnRyb2wgMQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IyCTB4MDQgLyogRXh0ZW5kZWQgQ29udHJvbCAyCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfVFhGTFYJMHgwNiAvKiBUWCBGSUZPIExldmVsCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JYRkxWCTB4MDcgLyogUlggRklGTyBMZXZlbAkJCSovCgkJCQkgICAgICAvKiBCYW5rIDMJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX01SSUQJMHgwMCAvKiBNb2R1bGUgSWRlbnRpZmljYXRpb24JCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSF9MQ1IJMHgwMSAvKiBMQ1IgU2hhZG93CQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0ZDUgkweDAyIC8qIEZDUiBTaGFkb3cJCQkqLwoJCQkJICAgICAgLyogQmFuayA0CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMQkweDAyIC8qIEluZnJhcmVkIENvbnRyb2wgMQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNQkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjIJMHgwNCAvKiBJbmZyYXJlZCBDb250cm9sIDIJCSovCgkJCQkgICAgICAvKiBCYW5rIDYJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IzCTB4MDAgLyogSW5mcmFyZWQgQ29udHJvbCAzCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0lSX1BXCTB4MDIgLyogU0lSIFB1bHNlIFdpZHRoCQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNwkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJSWERDCTB4MDAgLyogSVIgUlggRGVtb2QgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSVFhNQwkweDAxIC8qIElSIFRYIE1vZCBDb250cm9sCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUkNDRkcJMHgwMiAvKiBDRUlSIENvbmZpZwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNGRzEJMHgwNCAvKiBJbmZyYXJlZCBDb25maWcgMQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ0ZHNAkweDA3IC8qIEluZnJhcmVkIENvbmZpZyA0CQkqLwoKLyoKICogTWFnaWMgdmFsdWVzIGZvbGxvdwogKi8KCi8qIE5vIGludGVycnVwdHMgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9OT05FCQkweDAwCi8qIFJYIGRhdGEgYml0IGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfUlgJCTB4MDEKLyogVFggZGF0YSBsb3cgYml0IGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfVFhfTE9XCTB4MDIKLyogT3Zlci9VbmRlci1mbG93IGJpdCBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX0VSUgkJMHgwNAovKiBUWCBkYXRhIGVtcHR5IGJpdCBmb3IgV0JDRUlSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9UWF9FTVBUWQkweDIwCi8qIExlZCBlbmFibGUvZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19FQ0VJUl9DVFMgKi8KI2RlZmluZSBXQkNJUl9MRURfRU5BQkxFCTB4ODAKLyogUlggZGF0YSBhdmFpbGFibGUgYml0IGZvciBXQkNJUl9SRUdfU1AzX0xTUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0FWQUlMCQkweDAxCi8qIFJYIGRhdGEgb3ZlcnJ1biBlcnJvciBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfT1ZFUlJVTgkweDAyCi8qIFRYIEVuZC1PZi1UcmFuc21pc3Npb24gYml0IGZvciBXQkNJUl9SRUdfU1AzX0FTQ1IgKi8KI2RlZmluZSBXQkNJUl9UWF9FT1QJCTB4MDQKLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0RJU0FCTEUJMHgyMAovKiBUWCBkYXRhIHVuZGVycnVuIGVycm9yIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19BU0NSICovCiNkZWZpbmUgV0JDSVJfVFhfVU5ERVJSVU4JMHg0MAovKiBFeHRlbmRlZCBtb2RlIGVuYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfRVhDUjEgKi8KI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKLyogU2VsZWN0IGNvbXBhcmUgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9DT01QQVJFCTB4MTAKLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9NQVNLCTB4MjAKLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBzZWxlY3RlZCByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKi8KI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKCi8qIFZhbGlkIGJhbmtzIGZvciB0aGUgU1AzIFVBUlQgKi8KZW51bSB3YmNpcl9iYW5rIHsKCVdCQ0lSX0JBTktfMCAgICAgICAgICA9IDB4MDAsCglXQkNJUl9CQU5LXzEgICAgICAgICAgPSAweDgwLAoJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKCVdCQ0lSX0JBTktfMyAgICAgICAgICA9IDB4RTQsCglXQkNJUl9CQU5LXzQgICAgICAgICAgPSAweEU4LAoJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKCVdCQ0lSX0JBTktfNiAgICAgICAgICA9IDB4RjAsCglXQkNJUl9CQU5LXzcgICAgICAgICAgPSAweEY0LAp9OwoKLyogU3VwcG9ydGVkIHBvd2VyLW9uIElSIFByb3RvY29scyAqLwplbnVtIHdiY2lyX3Byb3RvY29sIHsKCUlSX1BST1RPQ09MX1JDNSAgICAgICAgICA9IDB4MCwKCUlSX1BST1RPQ09MX05FQyAgICAgICAgICA9IDB4MSwKCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKfTsKCi8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgSVIgcmVjZXB0aW9uICovCmVudW0gd2JjaXJfcnhzdGF0ZSB7CglXQkNJUl9SWFNUQVRFX0lOQUNUSVZFID0gMCwKCVdCQ0lSX1JYU1RBVEVfQUNUSVZFLAoJV0JDSVJfUlhTVEFURV9FUlJPUgp9OwoKLyogUG9zc2libGUgc3RhdGVzIGZvciBJUiB0cmFuc21pc3Npb24gKi8KZW51bSB3YmNpcl90eHN0YXRlIHsKCVdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkUgPSAwLAoJV0JDSVJfVFhTVEFURV9BQ1RJVkUsCglXQkNJUl9UWFNUQVRFX0RPTkUsCglXQkNJUl9UWFNUQVRFX0VSUk9SCn07CgovKiBNaXNjICovCiNkZWZpbmUgV0JDSVJfTkFNRQkiV2luYm9uZCBDSVIiCiNkZWZpbmUgV0JDSVJfSURfRkFNSUxZICAgICAgICAgIDB4RjEgLyogRmFtaWx5IElEIGZvciB0aGUgV1BDRDM3NkkJKi8KI2RlZmluZQlXQkNJUl9JRF9DSElQICAgICAgICAgICAgMHgwNCAvKiBDaGlwIElEIGZvciB0aGUgV1BDRDM3NkkJKi8KI2RlZmluZSBJTlZBTElEX1NDQU5DT0RFICAgMHg3RkZGRkZGRiAvKiBJbnZhbGlkIHdpdGggYWxsIHByb3RvcwkqLwojZGVmaW5lIFdBS0VVUF9JT01FTV9MRU4gICAgICAgICAweDEwIC8qIFdha2UtVXAgSS9PIFJlZyBMZW4JCSovCiNkZWZpbmUgRUhGVU5DX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogRW5oYW5jZWQgRnVuYyBJL08gUmVnIExlbgkqLwojZGVmaW5lIFNQX0lPTUVNX0xFTiAgICAgICAgICAgICAweDA4IC8qIFNlcmlhbCBQb3J0IDMgKElSKSBSZWcgTGVuCSovCgovKiBQZXItZGV2aWNlIGRhdGEgKi8Kc3RydWN0IHdiY2lyX2RhdGEgewoJc3BpbmxvY2tfdCBzcGlubG9jazsKCXN0cnVjdCByY19kZXYgKmRldjsKCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwoKCXVuc2lnbmVkIGxvbmcgd2Jhc2U7ICAgICAgICAvKiBXYWtlLVVwIEJhc2VhZGRyCQkqLwoJdW5zaWduZWQgbG9uZyBlYmFzZTsgICAgICAgIC8qIEVuaGFuY2VkIEZ1bmMuIEJhc2VhZGRyCSovCgl1bnNpZ25lZCBsb25nIHNiYXNlOyAgICAgICAgLyogU2VyaWFsIFBvcnQgQmFzZWFkZHIJKi8KCXVuc2lnbmVkIGludCAgaXJxOyAgICAgICAgICAvKiBTZXJpYWwgUG9ydCBJUlEJCSovCgl1OCBpcnFtYXNrOwoKCS8qIFJYIHN0YXRlICovCgllbnVtIHdiY2lyX3J4c3RhdGUgcnhzdGF0ZTsKCXN0cnVjdCBsZWRfdHJpZ2dlciAqcnh0cmlnZ2VyOwoJc3RydWN0IGlyX3Jhd19ldmVudCByeGV2OwoKCS8qIFRYIHN0YXRlICovCgllbnVtIHdiY2lyX3R4c3RhdGUgdHhzdGF0ZTsKCXN0cnVjdCBsZWRfdHJpZ2dlciAqdHh0cmlnZ2VyOwoJdTMyIHR4bGVuOwoJdTMyIHR4b2ZmOwoJdTMyICp0eGJ1ZjsKCXdhaXRfcXVldWVfaGVhZF90IHR4d2FpdHE7Cgl1OCB0eG1hc2s7Cgl1MzIgdHhjYXJyaWVyOwp9OwoKc3RhdGljIGVudW0gd2JjaXJfcHJvdG9jb2wgcHJvdG9jb2wgPSBJUl9QUk9UT0NPTF9SQzY7Cm1vZHVsZV9wYXJhbShwcm90b2NvbCwgdWludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocHJvdG9jb2wsICJJUiBwcm90b2NvbCB0byB1c2UgZm9yIHRoZSBwb3dlci1vbiBjb21tYW5kICIKCQkgIigwID0gUkM1LCAxID0gTkVDLCAyID0gUkM2QSwgZGVmYXVsdCkiKTsKCnN0YXRpYyBpbnQgaW52ZXJ0OyAvKiBkZWZhdWx0ID0gMCAqLwptb2R1bGVfcGFyYW0oaW52ZXJ0LCBib29sLCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpbnZlcnQsICJJbnZlcnQgdGhlIHNpZ25hbCBmcm9tIHRoZSBJUiByZWNlaXZlciIpOwoKc3RhdGljIGludCB0eGFuZHJ4OyAvKiBkZWZhdWx0ID0gMCAqLwptb2R1bGVfcGFyYW0odHhhbmRyeCwgYm9vbCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaW52ZXJ0LCAiQWxsb3cgc2ltdWx0YW5lb3VzIFRYIGFuZCBSWCIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3NjID0gMHg4MDBGMDQwQzsKbW9kdWxlX3BhcmFtKHdha2Vfc2MsIHVpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHdha2Vfc2MsICJTY2FuY29kZSBvZiB0aGUgcG93ZXItb24gSVIgY29tbWFuZCIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3JjNm1vZGUgPSA2Owptb2R1bGVfcGFyYW0od2FrZV9yYzZtb2RlLCB1aW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyh3YWtlX3JjNm1vZGUsICJSQzYgbW9kZSBmb3IgdGhlIHBvd2VyLW9uIGNvbW1hbmQgIgoJCSAiKDAgPSAwLCA2ID0gNkEsIGRlZmF1bHQpIik7CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBVVElMSVRZIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCB3YmNpcl9sb2NrICovCnN0YXRpYyB2b2lkCndiY2lyX3NldF9iaXRzKHVuc2lnbmVkIGxvbmcgYWRkciwgdTggYml0cywgdTggbWFzaykKewoJdTggdmFsOwoKCXZhbCA9IGluYihhZGRyKTsKCXZhbCA9ICgodmFsICYgfm1hc2spIHwgKGJpdHMgJiBtYXNrKSk7CglvdXRiKHZhbCwgYWRkcik7Cn0KCi8qIFNlbGVjdHMgdGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBzZXJpYWwgcG9ydCAqLwpzdGF0aWMgaW5saW5lIHZvaWQKd2JjaXJfc2VsZWN0X2Jhbmsoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGVudW0gd2JjaXJfYmFuayBiYW5rKQp7CglvdXRiKGJhbmssIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CU1IpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKd2JjaXJfc2V0X2lycW1hc2soc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIHU4IGlycW1hc2spCnsKCWlmIChkYXRhLT5pcnFtYXNrID09IGlycW1hc2spCgkJcmV0dXJuOwoKCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKGlycW1hc2ssIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOwoJZGF0YS0+aXJxbWFzayA9IGlycW1hc2s7Cn0KCnN0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzCndiY2lyX2xlZF9icmlnaHRuZXNzX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCgkJCQkJICAgICAgIHN0cnVjdCB3YmNpcl9kYXRhLAoJCQkJCSAgICAgICBsZWQpOwoKCWlmIChpbmIoZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ1RTKSAmIFdCQ0lSX0xFRF9FTkFCTEUpCgkJcmV0dXJuIExFRF9GVUxMOwoJZWxzZQoJCXJldHVybiBMRURfT0ZGOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCgkJCSBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAoJCQkJCSAgICAgICBzdHJ1Y3Qgd2JjaXJfZGF0YSwKCQkJCQkgICAgICAgbGVkKTsKCgl3YmNpcl9zZXRfYml0cyhkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMsCgkJICAgICAgIGJyaWdodG5lc3MgPT0gTEVEX09GRiA/IDB4MDAgOiBXQkNJUl9MRURfRU5BQkxFLAoJCSAgICAgICBXQkNJUl9MRURfRU5BQkxFKTsKfQoKLyogTWFuY2hlc3RlciBlbmNvZGVzIGJpdHMgdG8gUkM2IG1lc3NhZ2UgY2VsbHMgKHNlZSB3YmNpcl9zaHV0ZG93bikgKi8Kc3RhdGljIHU4CndiY2lyX3RvX3JjNmNlbGxzKHU4IHZhbCkKewoJdTggY29kZWQgPSAweDAwOwoJaW50IGk7CgoJdmFsICY9IDB4MEY7Cglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkJaWYgKHZhbCAmIDB4MDEpCgkJCWNvZGVkIHw9IDB4MDIgPDwgKGkgKiAyKTsKCQllbHNlCgkJCWNvZGVkIHw9IDB4MDEgPDwgKGkgKiAyKTsKCQl2YWwgPj49IDE7Cgl9CgoJcmV0dXJuIGNvZGVkOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSU5URVJSVVBUIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp3YmNpcl9pZGxlX3J4KHN0cnVjdCByY19kZXYgKmRldiwgYm9vbCBpZGxlKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGRldi0+cHJpdjsKCglpZiAoIWlkbGUgJiYgZGF0YS0+cnhzdGF0ZSA9PSBXQkNJUl9SWFNUQVRFX0lOQUNUSVZFKSB7CgkJZGF0YS0+cnhzdGF0ZSA9IFdCQ0lSX1JYU1RBVEVfQUNUSVZFOwoJCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwgTEVEX0ZVTEwpOwoJfQoKCWlmIChpZGxlICYmIGRhdGEtPnJ4c3RhdGUgIT0gV0JDSVJfUlhTVEFURV9JTkFDVElWRSkKCQkvKiBUZWxsIGhhcmR3YXJlIHRvIGdvIGlkbGUgYnkgc2V0dGluZyBSWElOQUNUSVZFICovCgkJb3V0YihXQkNJUl9SWF9ESVNBQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX2lycV9yeChzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgc3RydWN0IHBucF9kZXYgKmRldmljZSkKewoJdTggaXJkYXRhOwoJREVGSU5FX0lSX1JBV19FVkVOVChyYXdpcik7CgoJLyogU2luY2UgUlhIRExFViBpcyBzZXQsIGF0IGxlYXN0IDggYnl0ZXMgYXJlIGluIHRoZSBGSUZPICovCgl3aGlsZSAoaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19MU1IpICYgV0JDSVJfUlhfQVZBSUwpIHsKCQlpcmRhdGEgPSBpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSk7CgkJaWYgKGRhdGEtPnJ4c3RhdGUgPT0gV0JDSVJfUlhTVEFURV9FUlJPUikKCQkJY29udGludWU7CgkJcmF3aXIucHVsc2UgPSBpcmRhdGEgJiAweDgwID8gZmFsc2UgOiB0cnVlOwoJCXJhd2lyLmR1cmF0aW9uID0gVVNfVE9fTlMoKGlyZGF0YSAmIDB4N0YpICogMTApOwoJCWlyX3Jhd19ldmVudF9zdG9yZV93aXRoX2ZpbHRlcihkYXRhLT5kZXYsICZyYXdpcik7Cgl9CgoJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGdvIGlkbGUgKi8KCWlmIChkYXRhLT5kZXYtPmlkbGUpIHsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoJCWRhdGEtPnJ4c3RhdGUgPSBXQkNJUl9SWFNUQVRFX0lOQUNUSVZFOwoJfQoKCWlyX3Jhd19ldmVudF9oYW5kbGUoZGF0YS0+ZGV2KTsKfQoKc3RhdGljIHZvaWQKd2JjaXJfaXJxX3R4KHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7Cgl1bnNpZ25lZCBpbnQgc3BhY2U7Cgl1bnNpZ25lZCBpbnQgdXNlZDsKCXU4IGJ5dGVzWzE2XTsKCXU4IGJ5dGU7CgoJaWYgKCFkYXRhLT50eGJ1ZikKCQlyZXR1cm47CgoJc3dpdGNoIChkYXRhLT50eHN0YXRlKSB7CgljYXNlIFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkU6CgkJLyogVFggRklGTyBlbXB0eSAqLwoJCXNwYWNlID0gMTY7CgkJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+dHh0cmlnZ2VyLCBMRURfRlVMTCk7CgkJYnJlYWs7CgljYXNlIFdCQ0lSX1RYU1RBVEVfQUNUSVZFOgoJCS8qIFRYIEZJRk8gbG93ICgzIGJ5dGVzIG9yIGxlc3MpICovCgkJc3BhY2UgPSAxMzsKCQlicmVhazsKCWNhc2UgV0JDSVJfVFhTVEFURV9FUlJPUjoKCQlzcGFjZSA9IDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybjsKCX0KCgkvKgoJICogVFggZGF0YSBpcyBydW4tbGVuZ3RoIGNvZGVkIGluIGJ5dGVzOiBZWFhYWFhYWAoJICogWSA9IHNwYWNlICgxKSBvciBwdWxzZSAoMCkKCSAqIFggPSBkdXJhdGlvbiwgZW5jb2RlZCBhcyAoWCArIDEpICogMTB1cyAoaS5lIDEwIHRvIDEyODAgdXMpCgkgKi8KCWZvciAodXNlZCA9IDA7IHVzZWQgPCBzcGFjZSAmJiBkYXRhLT50eG9mZiAhPSBkYXRhLT50eGxlbjsgdXNlZCsrKSB7CgkJaWYgKGRhdGEtPnR4YnVmW2RhdGEtPnR4b2ZmXSA9PSAwKSB7CgkJCWRhdGEtPnR4b2ZmKys7CgkJCWNvbnRpbnVlOwoJCX0KCQlieXRlID0gbWluKCh1MzIpMHg4MCwgZGF0YS0+dHhidWZbZGF0YS0+dHhvZmZdKTsKCQlkYXRhLT50eGJ1ZltkYXRhLT50eG9mZl0gLT0gYnl0ZTsKCQlieXRlLS07CgkJYnl0ZSB8PSAoZGF0YS0+dHhvZmYgJSAyID8gMHg4MCA6IDB4MDApOyAvKiBwdWxzZS9zcGFjZSAqLwoJCWJ5dGVzW3VzZWRdID0gYnl0ZTsKCX0KCgl3aGlsZSAoZGF0YS0+dHhidWZbZGF0YS0+dHhvZmZdID09IDAgJiYgZGF0YS0+dHhvZmYgIT0gZGF0YS0+dHhsZW4pCgkJZGF0YS0+dHhvZmYrKzsKCglpZiAodXNlZCA9PSAwKSB7CgkJLyogRmluaXNoZWQgKi8KCQlpZiAoZGF0YS0+dHhzdGF0ZSA9PSBXQkNJUl9UWFNUQVRFX0VSUk9SKQoJCQkvKiBDbGVhciBUWCB1bmRlcnJ1biBiaXQgKi8KCQkJb3V0YihXQkNJUl9UWF9VTkRFUlJVTiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0FTQ1IpOwoJCWVsc2UKCQkJZGF0YS0+dHhzdGF0ZSA9IFdCQ0lSX1RYU1RBVEVfRE9ORTsKCQl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSKTsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT50eHRyaWdnZXIsIExFRF9PRkYpOwoJCXdha2VfdXAoJmRhdGEtPnR4d2FpdHEpOwoJfSBlbHNlIGlmIChkYXRhLT50eG9mZiA9PSBkYXRhLT50eGxlbikgewoJCS8qIEF0IHRoZSBlbmQgb2YgdHJhbnNtaXNzaW9uLCB0ZWxsIHRoZSBodyBiZWZvcmUgbGFzdCBieXRlICovCgkJb3V0c2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1RYREFUQSwgYnl0ZXMsIHVzZWQgLSAxKTsKCQlvdXRiKFdCQ0lSX1RYX0VPVCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0FTQ1IpOwoJCW91dGIoYnl0ZXNbdXNlZCAtIDFdLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfVFhEQVRBKTsKCQl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSIHwKCQkJCSAgV0JDSVJfSVJRX1RYX0VNUFRZKTsKCX0gZWxzZSB7CgkJLyogTW9yZSBkYXRhIHRvIGZvbGxvdy4uLiAqLwoJCW91dHNiKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SWERBVEEsIGJ5dGVzLCB1c2VkKTsKCQlpZiAoZGF0YS0+dHhzdGF0ZSA9PSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFKSB7CgkJCXdiY2lyX3NldF9pcnFtYXNrKGRhdGEsIFdCQ0lSX0lSUV9SWCB8IFdCQ0lSX0lSUV9FUlIgfAoJCQkJCSAgV0JDSVJfSVJRX1RYX0xPVyk7CgkJCWRhdGEtPnR4c3RhdGUgPSBXQkNJUl9UWFNUQVRFX0FDVElWRTsKCQl9Cgl9Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdAp3YmNpcl9pcnFfaGFuZGxlcihpbnQgaXJxbm8sIHZvaWQgKmNvb2tpZSkKewoJc3RydWN0IHBucF9kZXYgKmRldmljZSA9IGNvb2tpZTsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggc3RhdHVzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCXN0YXR1cyA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRUlSKTsKCXN0YXR1cyAmPSBkYXRhLT5pcnFtYXNrOwoKCWlmICghc3RhdHVzKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gSVJRX05PTkU7Cgl9CgoJaWYgKHN0YXR1cyAmIFdCQ0lSX0lSUV9FUlIpIHsKCQkvKiBSWCBvdmVyZmxvdz8gKHJlYWQgY2xlYXJzIGJpdCkgKi8KCQlpZiAoaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19MU1IpICYgV0JDSVJfUlhfT1ZFUlJVTikgewoJCQlkYXRhLT5yeHN0YXRlID0gV0JDSVJfUlhTVEFURV9FUlJPUjsKCQkJaXJfcmF3X2V2ZW50X3Jlc2V0KGRhdGEtPmRldik7CgkJfQoKCQkvKiBUWCB1bmRlcmZsb3c/ICovCgkJaWYgKGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUikgJiBXQkNJUl9UWF9VTkRFUlJVTikKCQkJZGF0YS0+dHhzdGF0ZSA9IFdCQ0lSX1RYU1RBVEVfRVJST1I7Cgl9CgoJaWYgKHN0YXR1cyAmIFdCQ0lSX0lSUV9SWCkKCQl3YmNpcl9pcnFfcngoZGF0YSwgZGV2aWNlKTsKCglpZiAoc3RhdHVzICYgKFdCQ0lSX0lSUV9UWF9MT1cgfCBXQkNJUl9JUlFfVFhfRU1QVFkpKQoJCXdiY2lyX2lycV90eChkYXRhKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogUkMtQ09SRSBJTlRFUkZBQ0UgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQKd2JjaXJfdHhjYXJyaWVyKHN0cnVjdCByY19kZXYgKmRldiwgdTMyIGNhcnJpZXIpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gZGV2LT5wcml2OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXU4IHZhbDsKCXUzMiBmcmVxOwoKCWZyZXEgPSBESVZfUk9VTkRfQ0xPU0VTVChjYXJyaWVyLCAxMDAwKTsKCWlmIChmcmVxIDwgMzAgfHwgZnJlcSA+IDYwKQoJCXJldHVybiAtRUlOVkFMOwoKCXN3aXRjaCAoZnJlcSkgewoJY2FzZSA1ODoKCWNhc2UgNTk6CgljYXNlIDYwOgoJCXZhbCA9IGZyZXEgLSA1ODsKCQlmcmVxICo9IDEwMDA7CgkJYnJlYWs7CgljYXNlIDU3OgoJCXZhbCA9IGZyZXEgLSAyNzsKCQlmcmVxID0gNTY5MDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXZhbCA9IGZyZXEgLSAyNzsKCQlmcmVxICo9IDEwMDA7CgkJYnJlYWs7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglpZiAoZGF0YS0+dHhzdGF0ZSAhPSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoKCWlmIChkYXRhLT50eGNhcnJpZXIgIT0gZnJlcSkgewoJCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNyk7CgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSVFhNQywgdmFsLCAweDFGKTsKCQlkYXRhLT50eGNhcnJpZXIgPSBmcmVxOwoJfQoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp3YmNpcl90eG1hc2soc3RydWN0IHJjX2RldiAqZGV2LCB1MzIgbWFzaykKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBkZXYtPnByaXY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggdmFsOwoKCS8qIEZvdXIgb3V0cHV0cywgb25seSBvbmUgb3V0cHV0IGNhbiBiZSBlbmFibGVkIGF0IGEgdGltZSAqLwoJc3dpdGNoIChtYXNrKSB7CgljYXNlIDB4MToKCQl2YWwgPSAweDA7CgkJYnJlYWs7CgljYXNlIDB4MjoKCQl2YWwgPSAweDE7CgkJYnJlYWs7CgljYXNlIDB4NDoKCQl2YWwgPSAweDI7CgkJYnJlYWs7CgljYXNlIDB4ODoKCQl2YWwgPSAweDM7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJaWYgKGRhdGEtPnR4c3RhdGUgIT0gV0JDSVJfVFhTVEFURV9JTkFDVElWRSkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCglpZiAoZGF0YS0+dHhtYXNrICE9IG1hc2spIHsKCQl3YmNpcl9zZXRfYml0cyhkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMsIHZhbCwgMHgwYyk7CgkJZGF0YS0+dHhtYXNrID0gbWFzazsKCX0KCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfdHgoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKmJ1ZiwgdTMyIGJ1ZnNpemUpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gZGV2LT5wcml2OwoJdTMyIGNvdW50OwoJdW5zaWduZWQgaTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyogYnVmc2l6ZSBoYXMgYmVlbiBzYW5pdHkgY2hlY2tlZCBieSB0aGUgY2FsbGVyICovCgljb3VudCA9IGJ1ZnNpemUgLyBzaXplb2YoaW50KTsKCgkvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHBvc3NpYmxlLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglpZiAoZGF0YS0+dHhzdGF0ZSAhPSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoKCS8qIENvbnZlcnQgdmFsdWVzIHRvIG11bHRpcGxlcyBvZiAxMHVzICovCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKCQlidWZbaV0gPSBESVZfUk9VTkRfQ0xPU0VTVChidWZbaV0sIDEwKTsKCgkvKiBGaWxsIHRoZSBUWCBmaWZvIG9uY2UsIHRoZSBpcnEgaGFuZGxlciB3aWxsIGRvIHRoZSByZXN0ICovCglkYXRhLT50eGJ1ZiA9IGJ1ZjsKCWRhdGEtPnR4bGVuID0gY291bnQ7CglkYXRhLT50eG9mZiA9IDA7Cgl3YmNpcl9pcnFfdHgoZGF0YSk7CgoJLyogV2FpdCBmb3IgdGhlIFRYIHRvIGNvbXBsZXRlICovCgl3aGlsZSAoZGF0YS0+dHhzdGF0ZSA9PSBXQkNJUl9UWFNUQVRFX0FDVElWRSkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CgkJd2FpdF9ldmVudChkYXRhLT50eHdhaXRxLCBkYXRhLT50eHN0YXRlICE9IFdCQ0lSX1RYU1RBVEVfQUNUSVZFKTsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCX0KCgkvKiBXZSdyZSBkb25lICovCglpZiAoZGF0YS0+dHhzdGF0ZSA9PSBXQkNJUl9UWFNUQVRFX0VSUk9SKQoJCWNvdW50ID0gLUVBR0FJTjsKCWRhdGEtPnR4c3RhdGUgPSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFOwoJZGF0YS0+dHhidWYgPSBOVUxMOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBTRVRVUC9JTklUL1NVU1BFTkQvUkVTVU1FIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp3YmNpcl9zaHV0ZG93bihzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7CglzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5kZXY7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOwoJYm9vbCBkb193YWtlID0gdHJ1ZTsKCXU4IG1hdGNoWzExXTsKCXU4IG1hc2tbMTFdOwoJdTggcmM2X2NzbCA9IDA7CglpbnQgaTsKCgltZW1zZXQobWF0Y2gsIDAsIHNpemVvZihtYXRjaCkpOwoJbWVtc2V0KG1hc2ssIDAsIHNpemVvZihtYXNrKSk7CgoJaWYgKHdha2Vfc2MgPT0gSU5WQUxJRF9TQ0FOQ09ERSB8fCAhZGV2aWNlX21heV93YWtldXAoZGV2KSkgewoJCWRvX3dha2UgPSBmYWxzZTsKCQlnb3RvIGZpbmlzaDsKCX0KCglzd2l0Y2ggKHByb3RvY29sKSB7CgljYXNlIElSX1BST1RPQ09MX1JDNToKCQlpZiAod2FrZV9zYyA+IDB4RkZGKSB7CgkJCWRvX3dha2UgPSBmYWxzZTsKCQkJZGV2X2VycihkZXYsICJSQzUgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQlicmVhazsKCQl9CgoJCS8qIE1hc2sgPSAxMyBiaXRzLCBleCB0b2dnbGUgKi8KCQltYXNrWzBdID0gMHhGRjsKCQltYXNrWzFdID0gMHgxNzsKCgkJbWF0Y2hbMF0gID0gKHdha2Vfc2MgJiAweDAwM0YpOyAgICAgIC8qIDYgY29tbWFuZCBiaXRzICovCgkJbWF0Y2hbMF0gfD0gKHdha2Vfc2MgJiAweDAxODApID4+IDE7IC8qIDIgYWRkcmVzcyBiaXRzICovCgkJbWF0Y2hbMV0gID0gKHdha2Vfc2MgJiAweDBFMDApID4+IDk7IC8qIDMgYWRkcmVzcyBiaXRzICovCgkJaWYgKCEod2FrZV9zYyAmIDB4MDA0MCkpICAgICAgICAgICAgIC8qIDJuZCBzdGFydCBiaXQgICovCgkJCW1hdGNoWzFdIHw9IDB4MTA7CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCWlmICh3YWtlX3NjID4gMHhGRkZGRkYpIHsKCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQlkZXZfZXJyKGRldiwgIk5FQyAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCWJyZWFrOwoJCX0KCgkJbWFza1swXSA9IG1hc2tbMV0gPSBtYXNrWzJdID0gbWFza1szXSA9IDB4RkY7CgoJCW1hdGNoWzFdID0gYml0cmV2OCgod2FrZV9zYyAmIDB4RkYpKTsKCQltYXRjaFswXSA9IH5tYXRjaFsxXTsKCgkJbWF0Y2hbM10gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRjAwKSA+PiA4KTsKCQlpZiAod2FrZV9zYyA+IDB4RkZGRikKCQkJbWF0Y2hbMl0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRjAwMDApID4+IDE2KTsKCQllbHNlCgkJCW1hdGNoWzJdID0gfm1hdGNoWzNdOwoKCQlicmVhazsKCgljYXNlIElSX1BST1RPQ09MX1JDNjoKCgkJaWYgKHdha2VfcmM2bW9kZSA9PSAwKSB7CgkJCWlmICh3YWtlX3NjID4gMHhGRkZGKSB7CgkJCQlkb193YWtlID0gZmFsc2U7CgkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogQ29tbWFuZCAqLwoJCQltYXRjaFswXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDApOwoJCQltYXNrWzBdICA9IDB4RkY7CgkJCW1hdGNoWzFdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgNCk7CgkJCW1hc2tbMV0gID0gMHhGRjsKCgkJCS8qIEFkZHJlc3MgKi8KCQkJbWF0Y2hbMl0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA4KTsKCQkJbWFza1syXSAgPSAweEZGOwoJCQltYXRjaFszXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTIpOwoJCQltYXNrWzNdICA9IDB4RkY7CgoJCQkvKiBIZWFkZXIgKi8KCQkJbWF0Y2hbNF0gPSAweDUwOyAvKiBtb2RlMSA9IG1vZGUwID0gMCwgaWdub3JlIHRvZ2dsZSAqLwoJCQltYXNrWzRdICA9IDB4RjA7CgkJCW1hdGNoWzVdID0gMHgwOTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAwICovCgkJCW1hc2tbNV0gID0gMHgwRjsKCgkJCXJjNl9jc2wgPSA0NDsKCgkJfSBlbHNlIGlmICh3YWtlX3JjNm1vZGUgPT0gNikgewoJCQlpID0gMDsKCgkJCS8qIENvbW1hbmQgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgMCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDQpOwoJCQltYXNrW2krK10gPSAweEZGOwoKCQkJLyogQWRkcmVzcyArIFRvZ2dsZSAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA4KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxMik7CgkJCW1hc2tbaSsrXSA9IDB4M0Y7CgoJCQkvKiBDdXN0b21lciBiaXRzIDcgLSAwICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTYpOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDIwKTsKCQkJbWFza1tpKytdID0gMHhGRjsKCgkJCWlmICh3YWtlX3NjICYgMHg4MDAwMDAwMCkgewoJCQkJLyogQ3VzdG9tZXIgcmFuZ2UgYml0IGFuZCBiaXRzIDE1IC0gOCAqLwoJCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyNCk7CgkJCQltYXNrW2krK10gPSAweEZGOwoJCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyOCk7CgkJCQltYXNrW2krK10gPSAweEZGOwoJCQkJcmM2X2NzbCA9IDc2OwoJCQl9IGVsc2UgaWYgKHdha2Vfc2MgPD0gMHgwMDdGRkZGRikgewoJCQkJcmM2X2NzbCA9IDYwOwoJCQl9IGVsc2UgewoJCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIEhlYWRlciAqLwoJCQltYXRjaFtpXSAgPSAweDkzOyAvKiBtb2RlMSA9IG1vZGUwID0gMSwgc3VibW9kZSA9IDAgKi8KCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gMHgwQTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAxICovCgkJCW1hc2tbaSsrXSA9IDB4MEY7CgoJCX0gZWxzZSB7CgkJCWRvX3dha2UgPSBmYWxzZTsKCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2UgbW9kZVxuIik7CgkJfQoKCQlicmVhazsKCglkZWZhdWx0OgoJCWRvX3dha2UgPSBmYWxzZTsKCQlicmVhazsKCX0KCmZpbmlzaDoKCWlmIChkb193YWtlKSB7CgkJLyogU2V0IGNvbXBhcmUgYW5kIGNvbXBhcmUgbWFzayAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0lOREVYLAoJCQkgICAgICAgV0JDSVJfUkVHU0VMX0NPTVBBUkUgfCBXQkNJUl9SRUdfQUREUjAsCgkJCSAgICAgICAweDNGKTsKCQlvdXRzYihkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9EQVRBLCBtYXRjaCwgMTEpOwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0lOREVYLAoJCQkgICAgICAgV0JDSVJfUkVHU0VMX01BU0sgfCBXQkNJUl9SRUdfQUREUjAsCgkJCSAgICAgICAweDNGKTsKCQlvdXRzYihkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9EQVRBLCBtYXNrLCAxMSk7CgoJCS8qIFJDNiBDb21wYXJlIFN0cmluZyBMZW4gKi8KCQlvdXRiKHJjNl9jc2wsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NTTCk7CgoJCS8qIENsZWFyIHN0YXR1cyBiaXRzIE5FQ19SRVAsIEJVRkYsIE1TR19FTkQsIE1BVENIICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfU1RTLCAweDE3LCAweDE3KTsKCgkJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBTZXQgTUFUQ0hfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMSwgMHgwNyk7CgoJCS8qIFNldCBDRUlSX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAxLCAweDAxKTsKCgl9IGVsc2UgewoJCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgQ2xlYXIgTUFUQ0hfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJCS8qIENsZWFyIENFSVJfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDAsIDB4MDEpOwoJfQoKCS8qCgkgKiBBQ1BJIHdpbGwgc2V0IHRoZSBIVyBkaXNhYmxlIGJpdCBmb3IgU1AzIHdoaWNoIG1lYW5zIHRoYXQgdGhlCgkgKiBvdXRwdXQgc2lnbmFscyBhcmUgbGVmdCBpbiBhbiB1bmRlZmluZWQgc3RhdGUgd2hpY2ggbWF5IGNhdXNlCgkgKiBzcHVyaW91cyBpbnRlcnJ1cHRzIHdoaWNoIHdlIG5lZWQgdG8gaWdub3JlIHVudGlsIHRoZSBoYXJkd2FyZQoJICogaXMgcmVpbml0aWFsaXplZC4KCSAqLwoJd2JjaXJfc2V0X2lycW1hc2soZGF0YSwgV0JDSVJfSVJRX05PTkUpOwoJZGlzYWJsZV9pcnEoZGF0YS0+aXJxKTsKCgkvKiBEaXNhYmxlIExFRCAqLwoJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+cnh0cmlnZ2VyLCBMRURfT0ZGKTsKCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnR4dHJpZ2dlciwgTEVEX09GRik7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXdiY2lyX3NodXRkb3duKGRldmljZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKd2JjaXJfaW5pdF9odyhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKewoJdTggdG1wOwoKCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJd2JjaXJfc2V0X2lycW1hc2soZGF0YSwgV0JDSVJfSVJRX05PTkUpOwoKCS8qIFNldCBQUk9UX1NFTCwgUlhfSU5WLCBDbGVhciBDRUlSX0VOIChuZWVkZWQgZm9yIHRoZSBsZWQpICovCgl0bXAgPSBwcm90b2NvbCA8PCA0OwoJaWYgKGludmVydCkKCQl0bXAgfD0gMHgwODsKCW91dGIodG1wLCBkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwpOwoKCS8qIENsZWFyIHN0YXR1cyBiaXRzIE5FQ19SRVAsIEJVRkYsIE1TR19FTkQsIE1BVENIICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOwoKCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgQ2xlYXIgTUFUQ0hfRU4gKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKCgkvKiBTZXQgUkM1IGNlbGwgdGltZSB0byBjb3JyZXNwb25kIHRvIDM2IGtIeiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ0ZHMSwgMHg0QSwgMHg3Rik7CgoJLyogU2V0IElSVFhfSU5WICovCglpZiAoaW52ZXJ0KQoJCW91dGIoMHgwNCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ0NUTCk7CgllbHNlCgkJb3V0YigweDAwLCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMKTsKCgkvKgoJICogQ2xlYXIgSVIgTEVELCBzZXQgU1AzIGNsb2NrIHRvIDI0TWh6LCBzZXQgVFggbWFzayB0byBJUlRYMSwKCSAqIHNldCBTUDNfSVJSWF9TVyB0byBiaW5hcnkgMDEsIGhlbHBmdWxseSBub3QgZG9jdW1lbnRlZAoJICovCglvdXRiKDB4MTAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUyk7CglkYXRhLT50eG1hc2sgPSAweDE7CgoJLyogRW5hYmxlIGV4dGVuZGVkIG1vZGUgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMik7CglvdXRiKFdCQ0lSX0VYVF9FTkFCTEUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FWENSMSk7CgoJLyoKCSAqIENvbmZpZ3VyZSBiYXVkIGdlbmVyYXRvciwgSVIgZGF0YSB3aWxsIGJlIHNhbXBsZWQgYXQKCSAqIGEgYml0cmF0ZSBvZjogKDI0TWh6ICogcHJlc2NhbGVyKSAvIChkaXZpc29yICogMTYpLgoJICoKCSAqIFRoZSBFQ0lSIHJlZ2lzdGVycyBpbmNsdWRlIGEgZmxhZyB0byBjaGFuZ2UgdGhlCgkgKiAyNE1oeiBjbG9jayBmcmVxIHRvIDQ4TWh6LgoJICoKCSAqIEl0J3Mgbm90IGRvY3VtZW50ZWQgaW4gdGhlIHNwZWNzLCBidXQgZmlmbyBsZXZlbHMKCSAqIG90aGVyIHRoYW4gMTYgc2VlbXMgdG8gYmUgdW5zdXBwb3J0ZWQuCgkgKi8KCgkvKiBwcmVzY2FsZXIgMS4wLCB0eC9yeCBmaWZvIGx2bCAxNiAqLwoJb3V0YigweDMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjIpOwoKCS8qIFNldCBiYXVkIGRpdmlzb3IgdG8gZ2VuZXJhdGUgb25lIGJ5dGUgcGVyIGJpdC9jZWxsICovCglzd2l0Y2ggKHByb3RvY29sKSB7CgljYXNlIElSX1BST1RPQ09MX1JDNToKCQlvdXRiKDB4QTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKCQlicmVhazsKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoJCW91dGIoMHg1MywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJCWJyZWFrOwoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgkJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CgkJYnJlYWs7Cgl9CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RIKTsKCgkvKiBTZXQgQ0VJUiBtb2RlICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YigweEMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTUNSKTsKCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKTsgLyogQ2xlYXIgTFNSICovCglpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01TUik7IC8qIENsZWFyIE1TUiAqLwoKCS8qIERpc2FibGUgUlggZGVtb2QsIHJ1bi1sZW5ndGggZW5jb2RpbmcvZGVjb2RpbmcsIHNldCBmcmVxIHNwYW4gKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNyk7CglvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SQ0NGRyk7CgoJLyogRGlzYWJsZSB0aW1lciAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS180KTsKCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IxKTsKCgkvKiBEaXNhYmxlIE1TUiBpbnRlcnJ1cHQsIGNsZWFyIEFVWF9JUlgsIG1hc2sgUlggZHVyaW5nIFRYPyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS181KTsKCW91dGIodHhhbmRyeCA/IDB4MDMgOiAweDAyLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjIpOwoKCS8qIERpc2FibGUgQ1JDICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzYpOwoJb3V0YigweDIwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjMpOwoKCS8qIFNldCBSWCBkZW1vZHVsYXRpb24gZnJlcSwgbm90IHJlYWxseSB1c2VkICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwoJb3V0YigweEYyLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJSWERDKTsKCgkvKiBTZXQgVFggbW9kdWxhdGlvbiwgMzZrSHosIDd1cyBwdWxzZSB3aWR0aCAqLwoJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJUWE1DKTsKCWRhdGEtPnR4Y2FycmllciA9IDM2MDAwOwoKCS8qIFNldCBpbnZlcnQgYW5kIHBpbiBkaXJlY3Rpb24gKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNGRzQpOwoKCS8qIFNldCBGSUZPIHRocmVzaG9sZHMgKFJYID0gOCwgVFggPSAzKSwgcmVzZXQgUlgvVFggKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKDB4OTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19GQ1IpOwoKCS8qIENsZWFyIEFVWCBzdGF0dXMgYml0cyAqLwoJb3V0YigweEUwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgoJLyogQ2xlYXIgUlggc3RhdGUgKi8KCWRhdGEtPnJ4c3RhdGUgPSBXQkNJUl9SWFNUQVRFX0lOQUNUSVZFOwoJZGF0YS0+cnhldi5kdXJhdGlvbiA9IDA7Cglpcl9yYXdfZXZlbnRfcmVzZXQoZGF0YS0+ZGV2KTsKCWlyX3Jhd19ldmVudF9oYW5kbGUoZGF0YS0+ZGV2KTsKCgkvKgoJICogQ2hlY2sgVFggc3RhdGUsIGlmIHdlIGRpZCBhIHN1c3BlbmQvcmVzdW1lIGN5Y2xlIHdoaWxlIFRYIHdhcwoJICogYWN0aXZlLCB3ZSB3aWxsIGhhdmUgYSBwcm9jZXNzIHdhaXRpbmcgaW4gdHh3YWl0cS4KCSAqLwoJaWYgKGRhdGEtPnR4c3RhdGUgPT0gV0JDSVJfVFhTVEFURV9BQ1RJVkUpIHsKCQlkYXRhLT50eHN0YXRlID0gV0JDSVJfVFhTVEFURV9FUlJPUjsKCQl3YWtlX3VwKCZkYXRhLT50eHdhaXRxKTsKCX0KCgkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwoJd2JjaXJfc2V0X2lycW1hc2soZGF0YSwgV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUik7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJd2JjaXJfaW5pdF9odyhkYXRhKTsKCWVuYWJsZV9pcnEoZGF0YS0+aXJxKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQKd2JjaXJfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldmljZSwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKewoJc3RydWN0IGRldmljZSAqZGV2ID0gJmRldmljZS0+ZGV2OwoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGE7CglpbnQgZXJyOwoKCWlmICghKHBucF9wb3J0X2xlbihkZXZpY2UsIDApID09IEVIRlVOQ19JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDEpID09IFdBS0VVUF9JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDIpID09IFNQX0lPTUVNX0xFTikpIHsKCQlkZXZfZXJyKGRldiwgIkludmFsaWQgcmVzb3VyY2VzXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghZGF0YSkgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0OwoJfQoKCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIGRhdGEpOwoKCXNwaW5fbG9ja19pbml0KCZkYXRhLT5zcGlubG9jayk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZkYXRhLT50eHdhaXRxKTsKCWRhdGEtPmViYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAwKTsKCWRhdGEtPndiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAxKTsKCWRhdGEtPnNiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAyKTsKCWRhdGEtPmlycSA9IHBucF9pcnEoZGV2aWNlLCAwKTsKCglpZiAoZGF0YS0+d2Jhc2UgPT0gMCB8fCBkYXRhLT5lYmFzZSA9PSAwIHx8CgkgICAgZGF0YS0+c2Jhc2UgPT0gMCB8fCBkYXRhLT5pcnEgPT0gMCkgewoJCWVyciA9IC1FTk9ERVY7CgkJZGV2X2VycihkZXYsICJJbnZhbGlkIHJlc291cmNlc1xuIik7CgkJZ290byBleGl0X2ZyZWVfZGF0YTsKCX0KCglkZXZfZGJnKCZkZXZpY2UtPmRldiwgIkZvdW5kIGRldmljZSAiCgkJIih3OiAweCVsWCwgZTogMHglbFgsIHM6IDB4JWxYLCBpOiAldSlcbiIsCgkJZGF0YS0+d2Jhc2UsIGRhdGEtPmViYXNlLCBkYXRhLT5zYmFzZSwgZGF0YS0+aXJxKTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOLCBEUlZOQU1FKSkgewoJCWRldl9lcnIoZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJZGF0YS0+d2Jhc2UsIGRhdGEtPndiYXNlICsgV0FLRVVQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfZnJlZV9kYXRhOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5lYmFzZSwgZGF0YS0+ZWJhc2UgKyBFSEZVTkNfSU9NRU1fTEVOIC0gMSk7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gZXhpdF9yZWxlYXNlX3diYXNlOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPnNiYXNlLCBkYXRhLT5zYmFzZSArIFNQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9lYmFzZTsKCX0KCgllcnIgPSByZXF1ZXN0X2lycShkYXRhLT5pcnEsIHdiY2lyX2lycV9oYW5kbGVyLAoJCQkgIElSUUZfRElTQUJMRUQsIERSVk5BTUUsIGRldmljZSk7CglpZiAoZXJyKSB7CgkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xhaW0gSVJRICV1XG4iLCBkYXRhLT5pcnEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9zYmFzZTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci10eCIsICZkYXRhLT50eHRyaWdnZXIpOwoJaWYgKCFkYXRhLT50eHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF9mcmVlX2lycTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci1yeCIsICZkYXRhLT5yeHRyaWdnZXIpOwoJaWYgKCFkYXRhLT5yeHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3R4dHJpZ2dlcjsKCX0KCglkYXRhLT5sZWQubmFtZSA9ICJjaXI6OmFjdGl2aXR5IjsKCWRhdGEtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSAiY2lyLXJ4IjsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX3NldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX3NldDsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX2dldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX2dldDsKCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZGV2aWNlLT5kZXYsICZkYXRhLT5sZWQpOwoJaWYgKGVycikKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9yeHRyaWdnZXI7CgoJZGF0YS0+ZGV2ID0gcmNfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWRhdGEtPmRldikgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0X3VucmVnaXN0ZXJfbGVkOwoJfQoKCWRhdGEtPmRldi0+ZHJpdmVyX25hbWUgPSBXQkNJUl9OQU1FOwoJZGF0YS0+ZGV2LT5pbnB1dF9uYW1lID0gV0JDSVJfTkFNRTsKCWRhdGEtPmRldi0+aW5wdXRfcGh5cyA9ICJ3YmNpci9jaXIwIjsKCWRhdGEtPmRldi0+aW5wdXRfaWQuYnVzdHlwZSA9IEJVU19IT1NUOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQ7CglkYXRhLT5kZXYtPmlucHV0X2lkLnByb2R1Y3QgPSBXQkNJUl9JRF9GQU1JTFk7CglkYXRhLT5kZXYtPmlucHV0X2lkLnZlcnNpb24gPSBXQkNJUl9JRF9DSElQOwoJZGF0YS0+ZGV2LT5tYXBfbmFtZSA9IFJDX01BUF9SQzZfTUNFOwoJZGF0YS0+ZGV2LT5zX2lkbGUgPSB3YmNpcl9pZGxlX3J4OwoJZGF0YS0+ZGV2LT5zX3R4X21hc2sgPSB3YmNpcl90eG1hc2s7CglkYXRhLT5kZXYtPnNfdHhfY2FycmllciA9IHdiY2lyX3R4Y2FycmllcjsKCWRhdGEtPmRldi0+dHhfaXIgPSB3YmNpcl90eDsKCWRhdGEtPmRldi0+cHJpdiA9IGRhdGE7CglkYXRhLT5kZXYtPmRldi5wYXJlbnQgPSAmZGV2aWNlLT5kZXY7CgoJZXJyID0gcmNfcmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmRldik7CglpZiAoZXJyKQoJCWdvdG8gZXhpdF9mcmVlX3JjOwoKCWRldmljZV9pbml0X3dha2V1cCgmZGV2aWNlLT5kZXYsIDEpOwoKCXdiY2lyX2luaXRfaHcoZGF0YSk7CgoJcmV0dXJuIDA7CgpleGl0X2ZyZWVfcmM6CglyY19mcmVlX2RldmljZShkYXRhLT5kZXYpOwpleGl0X3VucmVnaXN0ZXJfbGVkOgoJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZCk7CmV4aXRfdW5yZWdpc3Rlcl9yeHRyaWdnZXI6CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT5yeHRyaWdnZXIpOwpleGl0X3VucmVnaXN0ZXJfdHh0cmlnZ2VyOgoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKZXhpdF9mcmVlX2lycToKCWZyZWVfaXJxKGRhdGEtPmlycSwgZGV2aWNlKTsKZXhpdF9yZWxlYXNlX3NiYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTik7CmV4aXRfcmVsZWFzZV9lYmFzZToKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOKTsKZXhpdF9yZWxlYXNlX3diYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOwpleGl0X2ZyZWVfZGF0YToKCWtmcmVlKGRhdGEpOwoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQKd2JjaXJfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfTk9ORSk7CglmcmVlX2lycShkYXRhLT5pcnEsIGRldmljZSk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCgkvKiBDbGVhciBCVUZGX0VOLCBFTkRfRU4sIE1BVENIX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+ZGV2KTsKCglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT5yeHRyaWdnZXIpOwoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWQpOwoKCS8qIFRoaXMgaXMgb2sgc2luY2UgJmRhdGEtPmxlZCBpc24ndCBhY3R1YWxseSB1c2VkICovCgl3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQoJmRhdGEtPmxlZCwgTEVEX09GRik7CgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTik7CgoJa2ZyZWUoZGF0YSk7CgoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCB3YmNpcl9pZHNbXSA9IHsKCXsgIldFQzEwMjIiLCAwIH0sCgl7ICIiLCAwIH0KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHdiY2lyX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JjaXJfZHJpdmVyID0gewoJLm5hbWUgICAgID0gV0JDSVJfTkFNRSwKCS5pZF90YWJsZSA9IHdiY2lyX2lkcywKCS5wcm9iZSAgICA9IHdiY2lyX3Byb2JlLAoJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aod2JjaXJfcmVtb3ZlKSwKCS5zdXNwZW5kICA9IHdiY2lyX3N1c3BlbmQsCgkucmVzdW1lICAgPSB3YmNpcl9yZXN1bWUsCgkuc2h1dGRvd24gPSB3YmNpcl9zaHV0ZG93bgp9OwoKc3RhdGljIGludCBfX2luaXQKd2JjaXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogSW52YWxpZCBwb3dlci1vbiBwcm90b2NvbFxuIik7Cgl9CgoJcmV0ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmd2JjaXJfZHJpdmVyKTsKCWlmIChyZXQpCgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgX19leGl0CndiY2lyX2V4aXQodm9pZCkKewoJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YmNpcl9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdCh3YmNpcl9pbml0KTsKbW9kdWxlX2V4aXQod2JjaXJfZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCJEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBTdXBlckkvTyBDb25zdW1lciBJUiBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=